Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何更新父存储库';s历史记录以反映对子模块所做的更改';使用';git分支过滤器';?_Git - Fatal编程技术网

如何更新父存储库';s历史记录以反映对子模块所做的更改';使用';git分支过滤器';?

如何更新父存储库';s历史记录以反映对子模块所做的更改';使用';git分支过滤器';?,git,Git,我有两个Git存储库,我将它们称为A和B。RepoB恰好是Repoa的一个子模块 RepoB充满了我想从历史中删除的二进制文件。我可以很容易地运行分支过滤器命令,从repoB的历史记录中删除这些文件。那不是我的问题 我的问题是,在repoB上运行分支筛选器后,repoA中的数千个提交现在将指向(现在无效)repoB中的提交 因此,我的问题是:如何修改回购A的历史记录,以便每次回购A的提交都指向正确的回购B 谢谢你的帮助 我不是git专家 在我看来,由于您更改了历史记录,您需要删除子模块,然后重新

我有两个Git存储库,我将它们称为AB。RepoB恰好是Repoa的一个子模块

RepoB充满了我想从历史中删除的二进制文件。我可以很容易地运行分支过滤器命令,从repoB的历史记录中删除这些文件。那不是我的问题

我的问题是,在repoB上运行分支筛选器后,repoA中的数千个提交现在将指向(现在无效)repoB中的提交

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


谢谢你的帮助

我不是git专家

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

删除.gitmodules文件中的条目: 删除.git/config文件中的子模块项 删除为子模块创建的路径 git rm--缓存的B

现在将子模块添加回


如果另一个repo的源代码在没有重新控制的情况下重写了历史记录,我不确定您如何修复该历史记录。

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

说明有一个可用的
map
函数,它将打印与旧ID对应的新ID,因此您可以使用该函数创建永久地图文件

要更正子模块ID,您必须使用
--index filter
和一个相当复杂的脚本,该脚本使用
git ls files-s
,该脚本将此阶段信息转换为引用新的提交ID(当面临类似任务时,我使用
sed
),和
git update index--index info
,它使用新的阶段信息进行重写提交

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