Git: 子目录到子模块的转换
Git: Conversion of a Subdirectory to a Submodule
我已经成功地能够使用命令将子模块转换为子目录,例如这两个示例中概述的方法:
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
我已经成功地能够使用命令将子模块转换为子目录,例如这两个示例中概述的方法:
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