在给定分支的所有提交中重命名变量

时间:2016-09-21 05:28:23

标签: git

我的回购看起来像这样:

         (develop) D - E - F - G - H
                  /
(master) A - B - C

在代码审核过程中(我建议将develop合并到master),我被要求更改D中引入的变量的名称(例如将foo更改为bar)。如果我有耐心,我可以查看DEFGH中的所有提交,为每个提交创建修复提交然后完全拒绝foo,以便只有bar保留在历史记录中。

似乎应该有更好的方法。一个小小的谷歌搜索让我相信我应该能够使用git filter-branch做一些事情,但是当我重写历史和所有 - 我更愿意能够第一次做对,而不是做一堆奇怪的东西,并完全弄乱我的回购......

针对此问题的一些有用限制:

  • 我们可以假设名称foobar是全球唯一的。例如如果我执行sed -i 's/foo/bar/g' FILE,我会留下我想要的结果,而不必担心foobar这样的名称被错误地翻译为barbar
  • 我正在使用OS-X - 所以首选POSIX兼容的shell实用程序调用(尽管我必须努力从GNU变体转换)

1 个答案:

答案 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,以覆盖该副本。