3

我需要在存储库历史的最开始附近修改提交。自那次提交以来,可能已经有数百个分支、合并和合并冲突。

我尝试使用带有 --preserve-merges 选项的交互式 rebase,但我仍然收到数百个类似于“CONFLICT(内容):Foobar.cpp 中的合并冲突”的冲突错误。如果不是不可能的话,再次手动重新解决它们是非常不切实际的。

我听说过“rerere”功能,但只是现在,所以我还没有启用它。

4

3 回答 3

4

Rerere 不会在这里为您提供帮助。

您正在寻找git filter-branch. 根据您的更改,您可能可以使用比树过滤器更快的索引过滤器。通过这样做,您将更改所有后续的 SHA-1。

确保包含--all参数,以便更新所有引用。这将破坏使用此 repo 作为子模块的任何 repo,因为 SHA-1 将引用不存在的 repo。您将需要编写更多脚本来解决此问题。

此外,如果与您一起工作的任何人有任何未推送的提交,他们将不得不将git rebase --onto他们出色的工作推向历史上的新位置。

在接下来的几年里,我们希望看到对执行此类恶作剧的更多支持——尤其是在涉及子模块时。

于 2013-01-15T07:31:52.973 回答
0

newren/git-filter-repo似乎与 共享相同的目标git filter-branch,具有更简单的用户体验和更好的性能(请参阅为什么使用 filter-repo 而不是其他替代方案?):

请参阅下面的用户手册摘录以从 git 历史记录中删除密码泄漏

如果要修改文件内容,可以根据文件中的表达式列表进行修改,每行一个。例如,使用名为 expression.txt 的文件,其中包含

p455w0rd
foo==>bar
glob:*666*==>
regex:\bdriver\b==>pilot
literal:MM/DD/YYYY==>YYYY-MM-DD
regex:([0-9]{2})/([0-9]{2})/([0-9]{4})==>\3-\1-\2

然后运行

git filter-repo --replace-text 表达式.txt

将通过并将 p455w0rd 替换为REMOVED [...]

于 2021-03-09T11:40:42.187 回答
-1

这就是我会尝试的。没有保证,但值得一试

  1. 启用rerere ( git config rerere.enabled true)
  2. 启用rerere.autoupdate ( git config rerere.autoupdate true)
  3. 回到旧的提交并修复它,然后合并。希望 rerere 会在您进行过程中学习并开始自动解决冲突。
于 2013-01-15T07:26:50.993 回答