0

我有两个 Git 存储库,我将它们称为AB。Repo B恰好是 Repo A的子模块。

Repo B充满了我想从历史中删除的二进制文件。我可以轻松地运行一个分支过滤器命令来从 repo B的历史记录中删除这些文件。那不是我的问题。

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

所以我的问题是:如何修改 repo A 的历史记录,以便 repo A每次提交都指向 repo B 的正确提交

谢谢你的帮助!

4

2 回答 2

0

我不是 git 专家。

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

删除 .gitmodules 文件中的条目:

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

在 .git/config 文件中删除子模块的条目

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

删除为子模块创建的路径

git rm --cached B

现在重新添加子模块。

如果它的起源在没有重新克隆的情况下重写了历史,我不确定你如何修复另一个回购中的历史。

于 2012-08-25T20:42:58.633 回答
0

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

手册页说有一个map可用的函数可以打印哪个新 ID 对应于旧 ID,因此您可以使用该函数来创建永久映射文件。

要更正子模块 ID,您必须使用--index-filter一个相当复杂git ls-files -s的脚本,该脚本使用 ,转换此阶段信息以引用新提交 ID 的脚本(我sed在遇到类似任务时使用),并将git update-index --index-info新阶段信息用于重写提交。

于 2012-08-26T08:38:45.100 回答