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