Git:将子目录转换为子模块

11

我已成功地使用像这两个示例中概述的方法之类的命令将子模块转换为子目录:

子模块->子目录

子目录->子模块

挑战在于在一个目录上成功实现此操作,通过每次转换保留其历史记录
以上概述的这两种方法已经在一个简单的实验性存储库上运行得很好,但无法处理更复杂的存储库。例如,具有任意提交模式的存储库。

当尝试将以前是子模块的目录转换为子模块时,执行以下操作会出现问题:

git filter-branch --subdirectory-filter <lib-directory> -- --all

如果我理解正确。这会引发:

Rewrite c95281d27e4602e9af50146eefcf7c28f5bb4f35 
        (2/11)a989b207d3757f9803fd50fa2d77908a4dc1330e
fatal: failed to unpack tree object 
       c95281d27e4602e9af50146eefcf7c28f5bb4f35:lib/test_submodule
Could not initialize the index`

由于在INDEX中反复引用子模块,因此出现了绝对没有类似结果的情况。当子模块被转换时,会出现上述错误。

是否有一种执行filter-branch的方法,可以避免对子模块的这些早期引用?

编辑:我回来再次查看这个问题,我仍然没有找到解决方法。使用Subdir->Submodule方法和git filter-branch与普通目录一起使用很好;但是,当它碰到子模块时就会崩溃。发生崩溃的位置:

https://github.com/github/git-msysgit/blob/master/git-filter-branch.sh#L300

我无法理解其中的意义。

2个回答

23

在我的情况下,添加目录末尾的斜杠后它起作用了:

$ git filter-branch --subdirectory-filter htdocs/typo3_src -- --all
Rewrite cbe03e13da071403a2632263f1760b560398cdd3 (1/12) (0 seconds passed, remaining 0 predicted)    004b20fc15023539484c7f5990b99780f54dc0ac
fatal: failed to unpack tree object cbe03e13da071403a2632263f1760b560398cdd3:htdocs/typo3_src
Could not initialize the index

$ git filter-branch --subdirectory-filter htdocs/typo3_src/ -- --all
Rewrite ec6e3c7212f1080fc052c87b1129335ab5bee524 (5/10) (1 seconds passed, remaining 1 predicted)    
Ref 'refs/heads/master' was rewritten
Ref 'refs/remotes/origin/master' was rewritten
Ref 'refs/remotes/origin/develop' was rewritten
WARNING: Ref 'refs/remotes/origin/master' is unchanged
WARNING: Ref 'refs/tags/0.0.1' is unchanged

我不知道为什么它会起作用。非常感谢您的帮助。这拯救了我的一天。 - Drake .C

0

尝试通过提交哈希值进行过滤,而不是使用rev-list选项--all。

git filter-branch --subdirectory-filter <lib-directory> <hash>...

在我的情况下导致问题的提交是包含“子项目提交”的那个提交。例如:
git filter-branch --subdirectory-filter <lib-directory> c95281d27e4...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接