如何更新父存储库的历史记录以反映使用'git branch-filter'对子模块的历史记录所做的更改?

时间:2012-08-25 20:34:19

标签: git

我有两个Git存储库,我称之为 A B 。回购 B 恰好是回购 A 的子模块。

Repo B 充满了我想从历史记录中删除的二进制文件。我可以轻松运行branch-filter命令从repo B 的历史记录中删除这些文件。那不是我的问题。

我的问题是,在repo B 上运行branch-filter后,repo A 中的数千次提交现在将指向repo中的(now-invalid)提交

所以我的问题是:如何修改回购 A 的历史记录,以便每次提交回购 A 指向正确提交回购 B < /强>

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

我不是git专家。

在我看来,由于您更改了历史记录,因此您需要删除子模块,然后重新添加它。

删除.gitmodules文件中的条目:

[submodule "B"]
path = B
url = git@server:B

删除.git / config文件

中的子模块条目
[submodule "b"]
url = git@server:B

删除为子模块

创建的路径
  

git rm --cached B

现在重新添加子模块。

我不知道你是如何在另一个回购中修复历史记录的,如果它的来源有重新编号的历史记录而重新编制。

答案 1 :(得分:0)

过滤子模块存储库时,您需要记住每个提交ID的更改(在地图中)。然后,您还需要过滤父存储库,并且对于子模块的每次更改,而不是使用旧的提交ID,从地图中获取等效的新ID并使用它。我不确定如何在实践中做到这一切,因为我从来没有做过,但这里有一些想法:

man page表示可以使用map函数打印哪个新ID与旧ID相对应,因此您可以使用该ID创建永久地图文件。

要更正子模块ID,必须使用--index-filter和一个使用git ls-files -s的相当复杂的脚本,这个脚本会转换此阶段信息以引用新的提交ID(我使用{{1当遇到类似的任务时)和sed使用新的阶段信息进行重写提交。