如何变基 git 子模块保留对包含子模块的 git 存储库中子模块提交的引用?

How to rebase git submodule preserving references to submodule commits from git repository containing the submodule?

(目前我正在修复我的旧存储库,然后再发布。)

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

我有一个带有子模块的 git 项目。我想重写这些子模块的历史,但是因为我在开发过程中快进了这些子模块,所以我想修改主 git 存储库中指向其中一些子模块提交的链接到指向子模块变基后新提交的链接。 IE。我需要将 git 子模块与包含此子模块的 git 存储库结合使用。 (抱歉,文字太长,我不知道如何描述更短。)

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

正如我在“”中提到的,没有简单的解决方案。

你将不得不用 git filter-branch, looking for specific commits including a gitlink (special entry in the index)

重写你的主仓库的历史

你需要先建立子模块旧历史的 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(来自子模块的新历史记录).过滤器分支将提交新的 repo 状态,包括新的 gitlink(因为子模块是在正确的新 SHA1 上检出的)