Git 在给定分支上的所有提交中重命名变量
我的回购协议如下所示:Git 在给定分支上的所有提交中重命名变量,git,Git,我的回购协议如下所示: (develop) D - E - F - G - H / (master) A - B - C 在代码审查过程中(我建议将develop合并到master),我被要求更改D中引入的变量的名称(例如,将foo更改为bar)。如果我有耐心,我可以查看D、E、F、G和H中的所有提交,为每个提交创建修复提交,然后完全重新设置foo的基址,以便历史中只保留bar 看来应该有更好的办法。谷歌搜索一下让我相信我应该能够用git
(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
是全局唯一的。e、 g.如果我做了一个bar
,我将得到我想要的结果,而不用担心像sed-I's/foo/bar/g'文件
这样的名字被错误地翻译成foobar
barbar
- 我使用的是OS-X——因此最好使用符合POSIX的shell实用程序调用(尽管如果必须的话,我可以从GNU变体中进行翻译)
- 您的尝试已经非常接近了
git filter-branch --tree-filter 'sed -i "s/foo/bar/g" $FILES' D^..H HEAD
假设您在develope
分支上,用提交索引替换D和H
如果你把事情搞砸了,总是会有问题。您还可以在提交引用之前进行分支或手工编写提交引用,作为保护措施。但是,我建议在单独的分支中执行此操作
$FILES
以下是包含变量的文件列表。我想您可以用$(git grep——仅限名称foo)
替换它。我从来没有尝试过,你可能不得不转义$
符号。当然,最简单的选择是在那里手工编写一个文件列表
编辑:刚刚试过。它不会逃跑<但是,如果没有输入文件,则代码>sed将失败,从而中止该过程。您还可以在
.git/refs/original/
中获得旧refs的副本,因此如果这不是您第一次尝试,您可能需要在git filter branch
之后添加-f
,以便覆盖副本。您的尝试已经非常接近了
git filter-branch --tree-filter 'sed -i "s/foo/bar/g" $FILES' D^..H HEAD
假设您位于develd
分支上,然后用提交索引替换D和H
如果你把事情搞砸了,总是会有问题。您还可以在提交引用之前进行分支或手工编写提交引用,作为保护措施。但是,我建议在单独的分支中执行此操作
$FILES
以下是包含变量的文件列表。我想您可以用$(git grep——仅限名称foo)
替换它。我从来没有尝试过,你可能不得不转义$
符号。当然,最简单的选择是在那里手工编写一个文件列表
编辑:刚刚试过。它不会逃跑<但是,如果没有输入文件,则代码>sed将失败,从而中止该过程。您还可以在
.git/refs/original/
中获得旧引用的副本,因此如果不是第一次尝试,您可能需要在git过滤器分支
之后添加-f
,以覆盖副本。为什么要更改历史记录?只需在开发时再次提交,将foo替换为bar,然后合并。@GreenAsJade——如果所有提交都是干净的,那么我可以恢复其中任何一个结果不好的提交,并且(希望)其他所有内容仍然有效。例如,在“代码> F < /代码>中引入bug的情况。如果我做了一个新的提交来重命名所有内容,我不能简单地恢复F
,而不必处理大量冲突。@mgilson IMHO保持所有提交“干净”有点贵(考虑到恢复在我的生活中并不常见)。并且在引入更多提交后,可恢复提交可能会变得不可恢复。保持合并提交的可恢复性可能更容易。@Jokester--是的。如果它最终变得比它的价值更麻烦,我会继续,并作出另一个承诺,并完成它。我也经常git-rebase
在合并到master之前清理脏提交,当我回顾我的回购历史,试图找出在哪里(以及为什么)发生了什么变化时,我发现这非常有用。在我的历史中,噪音越小,我就越快乐(也许这是一个比revert
案例更令人信服的用例?)。我想我只是希望一个git大师能放下一行代码,比如:git过滤器分支——树过滤器‘sed-I’s/foo/bar’——开发
…为什么要改变历史?只需在开发时再次提交,将foo替换为bar,然后合并。@GreenAsJade——如果所有提交都是干净的,那么我可以恢复其中任何一个结果不好的提交,并且(希望)其他所有内容仍然有效。例如,在“代码> F < /代码>中引入bug的情况。如果我做了一个新的提交来重命名所有内容,我不能简单地恢复F
,而不必处理大量冲突。@mgilson IMHO保持所有提交“干净”有点贵(考虑到恢复在我的生活中并不常见)。并且在引入更多提交后,可恢复提交可能会变得不可恢复。保持合并提交的可恢复性可能更容易。@Jokester--是的。如果它最终变得比它的价值更麻烦,我会继续,并作出另一个承诺,并完成它。我也经常git-rebase
在合并到master之前清理脏提交,当我回顾我的回购历史,试图找出在哪里(以及为什么)发生了什么变化时,我发现这非常有用。在我的历史中,噪音越小,我就越快乐(也许这是一个比其他人更令人信服的用例)