如何重命名git子模块,保留对包含子模块的git存储库的子模块提交的引用?

时间:2016-10-23 00:24:55

标签: git git-submodules rebase git-filter-branch

(目前我在发布之前修复了我的旧存储库。)

我已经知道如何rewrite commit author e-mail and name in git history

我有一个带子模块的git项目。我想重写这些子模块的历史记录,但是因为我在开发过程中快速转发这些子模块,我想修改主git repo中指向某些子模块的链接提交到指向子模块rebase之后的新提交的链接。即我需要将git子模块与包含此子模块的rebased git存储库一起重新绑定。 (对不起,由于篇幅太长,我不知道如何描述那么短。)

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

1 个答案:

答案 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中检出)