有没有'git sed'或同等价值?

Cla*_*ley 41 linux git bash sed

假设我想重命名git存储库中包含的源代码中的方法.我可以手动执行此操作,但方法名称可能位于多个位置(例如,单元测试,文档,实际方法).要检查方法的使用位置,我使用'git grep'.我得到'git grep'只显示我想要更改的行,然后我没有自动更改这些行的工作流程.

我正在寻找一种自动化方式(希望使用git工具)来完成最后一步.我希望有某种'git sed'或等同物,但我找不到任何东西.

我想的界面会很好:git sed's/old-method-name/new-method-name/g'

Gre*_*ill 49

你可以使用git ls-files联合xargssed:

git ls-files -z | xargs -0 sed -i -e 's/old-method-name/new-method-name/g'
Run Code Online (Sandbox Code Playgroud)

  • 是.如果文件名中有空格,请使用`git ls-files -z | xargs -0 sed ...`. (3认同)
  • 可能,但我认为你可以将 -z 传递给 `ls-files` 并将 `-0` 传递给 xargs 以使其工作。 (2认同)
  • 这种技术对我来说仍然失败了,b/c我在repo中有子模块导致sed在获取ls-files中列出的所有文件之前退出.至少我认为这是正在发生的事情.我仍在对它进行故障排除,因为我赞成这种方法优于@NoufalIbrahim,因为方法名只在一个地方. (2认同)

Cla*_*ley 18

感谢Noufal和Greg的帖子.我结合他们的解决方案,发现一个使用git grep(比我的repo更健壮的git ls-files,因为它似乎只列出了其中包含实际src代码的文件 - 例如,不是子模块文件夹),并且还有仅在一个地方使用旧方法名称和新方法名称:

[alias]我的~/.gitconfig文件块中:

sed = ! git grep -z --full-name -l '.' | xargs -0 sed -i -e
Run Code Online (Sandbox Code Playgroud)

使用:

git sed 's/old-method-name/new-method-name/ig'
Run Code Online (Sandbox Code Playgroud)


Nou*_*him 11

你可以做一个

for i in $(git grep --full-name -l old_method_name)
do
 perl -p -i -e 's/old_method_name/new_method_name/g' $i
done
Run Code Online (Sandbox Code Playgroud)

将其粘贴在某个文件中,然后将其作为git sed配置中的别名.

更新: tchrist的评论是一个更好的解决方案,因为它可以防止perl重复产生.

  • 我怀疑你在命令结尾处需要一个`$ i`.此外,您不必重复启动Perl.它将处理您作为参数提供的所有文件.所以`perl -i.orig -pe的/\bold_method_name\b/new_method_name/g'$(git grep --full-name -l old_method_name)`就足够了. (5认同)

Mr *_*ooz 9

这是一个结合了Noufal和claytontstanley的解决方案,避免触及不会改变的文件.

[alias]我的~/.gitconfig文件块中:

psed = !sh -c 'git grep --null --full-name --name-only --perl-regexp -e \"$1\" | xargs -0 perl -i -p -e \"s/$1/$2/g\"' -
Run Code Online (Sandbox Code Playgroud)

使用:

git psed old_method_name new_method_name
Run Code Online (Sandbox Code Playgroud)


Oma*_*awi 5

是的,有。在 Ubuntu 中,该软件包git-extras提供了命令。安装它:

$ sudo apt-get install git-extras
Run Code Online (Sandbox Code Playgroud)

像下面一样使用它,例如快速纠正拼写问题:

$ git sed 'qoute' 'quote'
Run Code Online (Sandbox Code Playgroud)

不幸的是,它不支持像 git grep 那样的文件过滤器:

$ git grep -e 'class' -- '*.py'
Run Code Online (Sandbox Code Playgroud)

Mac 和其他操作系统上也存在相同的功能。查看其安装页面