(当前,我在发布之前正在修复旧的存储库。)
我已经知道如何在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] 删除。
我来说两句