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

时间:2015-05-19 12:34:16

标签: git git-submodules

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

Submodule->Subdir

Subdir->Submodule

挑战是在目录上成功实现此目标,通过每次转化保留其历史记录
上面列出的这两种方法在一个简单的实验存储库上运行良好,但不处理更复杂的存储库。例如,具有任意提交模式的仓库。

执行

时问题会暴露出来

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以避免这些早期对子模块的引用?

编辑:我再次回来看这个问题,但我还没有找到解决问题的方法。使用带有git filter-branch的Subdir-&gt;子模块方法适用于普通目录;但碰到子模块时会崩溃。 git中此部分发生的崩溃:

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

虽然我无法理解它。

2 个答案:

答案 0 :(得分:14)

对我来说,在向目录添加一个尾部斜杠之后它才起作用:

$ 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

答案 1 :(得分:0)

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

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

在我的案例中导致问题的提交是包含Subproject commit的提交。例如:

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