我将git存储库的内容移动到另一个存储库,对于所有常规提交,一切都很好。不过,我遇到了子模块的问题。git filter-tree和修改子模块
设置,我们从两个回购开始。我们称他们为“文档”,“行动”,我们要“文档”的内容移动到“操作”的子目录,像这样:
docs/
file1.txt
dir1/
file2.txt
other-docs/ <- This is a git submodule
operations/
bin/
do-things
docs/
important.txt
而且我们希望最终版本看这样,这里的“文档”回购协议在操作回购“文档/遗产”结束:
operations/
bin/
do-things
docs/
important.txt
legacy/
file1.txt
dir1/
file2.txt
other-docs/ <- This is a git submodule
我有一个使用的git filter-branch --tree-filter
和git rebase
一个组合的脚本(衍合新的内容到现有的内容和处理冲突如.gitignore
文件)来执行实际的迁移,但是,在运行迁移后,我最终得到:
其中other-docs
子模块仍位于新回购的根部。
我明白为什么会发生这种情况。当我通过提交移动东西时,没有子模块的实际文件,因此,在“该目录中的所有内容都按照您离开它的方式提交”模型git filter-branch --tree-filter
,有没有任何“离开“用于子模块。
所以,第一个问题:是否有一些方面使用git filter-branch
我可以解释这一点?我想知道的一个地方是,如果我可以添加--commit-filter
并弄乱那里的东西,但我并不完全清楚提交过滤器周围的不变量是什么。
如果不存在,是否有其他地方我可以做到这一点。据我所知,我将不得不修改子模块的现有提交,基本上“删除”旧的不正确位置的子模块,并将子模块“添加”到新的正确位置。我想我可以通过一个交互式的rebase操作来编写脚本,找到这些提交并修改它们。如果有更好的方法,这听起来像很多工作。
任何想法赞赏。
尼斯:我没有注意到--prefix保持当前索引内容不变,只是增加了新的内容。 'git checkout'和'git add'步骤有点痛苦,但几乎每种方法都是如此。 – torek
@torek Yah,如果你愿意,你可以真正运行它作为一个树型过滤器,在读取树中添加一个“-u”以更新工作树并消除签出并添加,因为filter-branch只会遍历整个树对你来说,但浪费的流失如此冒犯了我无法遵守的感情。嗯。我应该把它作为一种选择,让任何人不会因为浪费而被冒犯。 – jthill
heh。不。不能让自己发布结果,不管它看起来更干净。 – jthill