Git: 子目录到子模块的转换

Git: Conversion of a Subdirectory to a Submodule

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

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->Submodule 方法对普通目录工作正常;但是当它碰到子模块时崩溃。 在 git:

内此部分不断发生的崩溃

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

虽然我不太明白。

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

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

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

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

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

$ 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