我需要在我的存储库历史的最开头修改提交。由于该提交可能存在数百个分支,合并和合并冲突。
我尝试使用带有--preserve-merges选项的交互式rebase,但我仍然遇到数百个类似于“CONFLICT(内容):在Foobar.cpp中合并冲突”的冲突错误。如果不是不可能的话,手动重新解决它们是非常不切实际的。
我听说过'rerere'功能,但只是刚才,所以我没有启用它。
答案 0 :(得分:3)
Rerere不会帮助你。
您正在寻找git filter-branch
。根据您的更改,您可以使用索引过滤器,它将比树过滤器更快。您将通过执行此操作来更改所有后续SHA-1。
确保包含--all
参数,以便更新所有引用。这将破坏使用此repo作为子模块的任何repo,因为SHA-1将引用不存在的repo。你需要做更多的脚本来解决这个问题。
此外,如果您与之合作的任何人都有任何未提交的提交,他们必须git rebase --onto
将他们的杰出工作带到历史中的新地点。
在接下来的几年中,我们希望能够获得更多支持来执行此类诡计 - 特别是涉及子模块时。
答案 1 :(得分:0)
newren/git-filter-repo 似乎与 git filter-branch
有着相同的目标,具有更简单的用户体验和更好的性能(参见 Why filter-repo instead of other alternatives?):
请参阅下面的 user manual 摘录以从 git 历史记录中删除密码泄漏
<块引用>如果要修改文件内容,可以根据文件中的表达式列表进行修改,每行一个。例如,一个名为expressions.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
将通过并用 REMOVED [...]
替换 p455w0rd答案 2 :(得分:-1)
这就是我想要的。没有保证,但值得一试
git config rerere.enabled true
)git config rerere.autoupdate true
)