如何重新设置git子模块,以保留对包含子模块的git存储库中对子模块提交的引用?

维亚切斯拉夫·纳帕多夫斯基

(当前,我在发布之前正在修复旧的存储库。)

我已经知道如何在git历史中重写提交作者的电子邮件和姓名

我有一个带有子模块的git项目。我想重写这些子模块的历史记录,但是由于我在开发过程中快速转发了这些子模块,所以我想修改主git repo中指向其中一些子模块提交的链接,再修改为指向子模块重新设置基准后新提交的链接。即我需要将git子模块与包含该子模块的git存储库重新基准化。(抱歉,对于太长的文字,我不知道如何形容得更短。)

如何与包含子模块的git存储库历史同步重写git子模块历史?

正如我在“重写子模块的历史记录后,带子模块的存储库”中提到的那样,没有简单的解决方案。

您将必须使用重写主仓库的历史记录,以git filter-branch查找包括gitlink索引中的特殊条目)的特定提交。

您首先需要在子模块旧历史记录的SHA1与主仓库使用的gitlinks之间建立对应关系

 cd /submodule/repo/just/rewritten/
 # the old history is still available in refs/original
 git -C /path/to/rewritten/repo for-each-ref --format="%(refname)" refs/original

 cd /main/repo
git for-each-ref --contains <SHA1> # SHA being a SHA1 from the old submodule history

然后,您需要更换

git filter-branch --prune-empty --tree-filter 'change_gitlink'

change_gitlink将是一个脚本,该脚本将进入子模块文件夹(因此--tree-filter,而不是--index-filter),从子模块的新历史记录中签出新的SHA1。filter分支将提交新的repo状态,包括新的gitlink(因为在正确的新SHA1处检出了子模块)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章