我的回购看起来像这样:
(develop) D - E - F - G - H
/
(master) A - B - C
在代码审核过程中(我建议将develop
合并到master
),我被要求更改D
中引入的变量的名称(例如将foo
更改为bar
)。如果我有耐心,我可以查看D
,E
,F
,G
和H
中的所有提交,为每个提交创建修复提交然后完全拒绝foo
,以便只有bar
保留在历史记录中。
似乎应该有更好的方法。一个小小的谷歌搜索让我相信我应该能够使用git filter-branch
做一些事情,但是当我重写历史和所有 - 我更愿意能够第一次做对,而不是做一堆奇怪的东西,并完全弄乱我的回购......
针对此问题的一些有用限制:
foo
和bar
是全球唯一的。例如如果我执行sed -i 's/foo/bar/g' FILE
,我会留下我想要的结果,而不必担心foobar
这样的名称被错误地翻译为barbar
。答案 0 :(得分:4)
你的尝试已经非常接近了。
git filter-branch --tree-filter 'sed -i "s/foo/bar/g" $FILES' D^..H HEAD
假设您在develop
分支上,并用提交索引替换D和H.
如果你搞砸了,总会有reflog。您还可以在提交之前进行分支或手动编写提交引用,然后再将其作为安全措施。不过,我建议在另一个分支中执行此操作。
$FILES
这里是包含您的变量的文件列表。我想你可以用$(git grep --name-only foo)
替换它。我没有尝试过,你可能不得不逃避$
符号。当然,最简单的选择是手写一个文件列表。
编辑:刚试过。它没有逃脱。但是,如果没有输入文件,则sed
会失败,从而中止该过程。您还会在.git/refs/original/
中获得旧参考的副本,因此如果这不是您的第一次尝试,您可能需要在-f
之后添加git filter-branch
,以覆盖该副本。