(目前我在发布之前修复了我的旧存储库。)
我已经知道如何rewrite commit author e-mail and name in git history。
我有一个带子模块的git项目。我想重写这些子模块的历史记录,但是因为我在开发过程中快速转发这些子模块,我想修改主git repo中指向某些子模块的链接提交到指向子模块rebase之后的新提交的链接。即我需要将git子模块与包含此子模块的rebased git存储库一起重新绑定。 (对不起,由于篇幅太长,我不知道如何描述那么短。)
如何与包含子模块的git存储库历史记录同步重写git子模块历史记录?
答案 0 :(得分:2)
正如我在" Repository with submodules after rewriting history of submodule"中提到的,没有简单的解决方案。
您必须使用git filter-branch
重写主仓库的历史记录,查找具体提交内容,包括 gitlink (special entry in the index)
首先需要在子模块旧历史的SHA1与主仓库使用的gitlink之间建立对应关系
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中检出)