Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 在给定分支上的所有提交中重命名变量_Git - Fatal编程技术网

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
    bar
    是全局唯一的。e、 g.如果我做了一个
    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之前清理脏提交,当我回顾我的回购历史,试图找出在哪里(以及为什么)发生了什么变化时,我发现这非常有用。在我的历史中,噪音越小,我就越快乐(也许这是一个比其他人更令人信服的用例)