我需要在存储库历史的最开始附近修改提交。自那次提交以来,可能已经有数百个分支、合并和合并冲突。
我尝试使用带有 --preserve-merges 选项的交互式 rebase,但我仍然收到数百个类似于“CONFLICT(内容):Foobar.cpp 中的合并冲突”的冲突错误。如果不是不可能的话,再次手动重新解决它们是非常不切实际的。
我听说过“rerere”功能,但只是现在,所以我还没有启用它。
我需要在存储库历史的最开始附近修改提交。自那次提交以来,可能已经有数百个分支、合并和合并冲突。
我尝试使用带有 --preserve-merges 选项的交互式 rebase,但我仍然收到数百个类似于“CONFLICT(内容):Foobar.cpp 中的合并冲突”的冲突错误。如果不是不可能的话,再次手动重新解决它们是非常不切实际的。
我听说过“rerere”功能,但只是现在,所以我还没有启用它。
Rerere 不会在这里为您提供帮助。
您正在寻找git filter-branch
. 根据您的更改,您可能可以使用比树过滤器更快的索引过滤器。通过这样做,您将更改所有后续的 SHA-1。
确保包含--all
参数,以便更新所有引用。这将破坏使用此 repo 作为子模块的任何 repo,因为 SHA-1 将引用不存在的 repo。您将需要编写更多脚本来解决此问题。
此外,如果与您一起工作的任何人有任何未推送的提交,他们将不得不将git rebase --onto
他们出色的工作推向历史上的新位置。
在接下来的几年里,我们希望看到对执行此类恶作剧的更多支持——尤其是在涉及子模块时。
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 [...]
这就是我会尝试的。没有保证,但值得一试
git config rerere.enabled true
)git config rerere.autoupdate true
)