Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git筛选器分支:保持目录结构不变_Git - Fatal编程技术网

git筛选器分支:保持目录结构不变

git筛选器分支:保持目录结构不变,git,Git,我的存储库中有一个目录结构: |-repository/ | | |-repository/fileOne | | | |-subOne/ | | |-subOne/fileTwo | | | |-subTwo/ | |-subTwo/fileThree 我想将目录子目录移动到另一个存储库中。为此,我使用git filter branch分离subOne,如下所示: $ git filter-branch --subdirectory-filter subOne --p

我的存储库中有一个目录结构:

|-repository/
|  |  |-repository/fileOne
|  |
|  |-subOne/
|  |  |-subOne/fileTwo
|  |
|  |-subTwo/
|     |-subTwo/fileThree
我想将目录
子目录
移动到另一个存储库中。为此,我使用
git filter branch
分离
subOne
,如下所示:

$ git filter-branch --subdirectory-filter subOne --prune-empty
这给我留下了一个分支历史记录,如下所示:

$ git log --oneline
0c0ea11 subOne history
6318bba subOne history
c96fddb Initial commit
这正是我想要的;从另一个存储库中,我可以执行
git fetch
git merge
,这会将
subOne
和历史添加到另一个存储库中。太好了

但是,
git过滤器分支
已删除
subOne
。正在检查我的分支上的目录结构:

$ ls
fileOne
$ pwd
/this/is/a/path/repository
pwd
应为:
/this/is/a/path/repository
,但
ls
应在存储库内显示
子目录。取而代之的是
subOne
中的文件向上移动,目录被删除

如何在不丢失目录的情况下提取
子目录

pwd应为:/this/is/a/path/repository,但ls应在存储库中显示子目录。取而代之的是subOne中的文件向上移动,目录被删除

原来这是git filter branch--subdirectory filter
的默认操作。引用自
曼吉特过滤器分支

结果将包含该目录(并且仅包含该目录)作为其项目根目录

要解决此问题,我想将
/
中的所有内容都转移到
/子目录
。幸运的是,在
mangit过滤器分支
示例
下有一段巫毒代码:


编辑:这在MAC OS X上不起作用。更多信息请参见我的问题
BSD sed
与GNU sed不同,这很烦人。要在OSX上运行该示例,请将
sed
更改为
gsed
;然后过滤器工作得很好

我认为如果您喜欢OSX上的MacPorts,filter branch可能会调用
sh
而不是
zsh
使用
brew安装gnu sed
在OSXOr上获得gsed,或者使用
port安装coreutils
。或者,如
man git filter branch
所建议的,请使用其他历史过滤工具,例如。
To move the whole tree into a subdirectory, or remove it from there:
       git filter-branch --index-filter \
               'git ls-files -s | sed "s-\t\"*-&newsubdir/-" |
                       GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
                               git update-index --index-info &&
                mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD