有没有“git sed”或相当的?

比方说,我想重命名一个git仓库中的源代码的方法。 我可以手工完成,但方法名可能在多个地方(例如,unit testing,文档,实际方法)。 要检查方法的用处,我使用'git grep'。 我得到“git grep”只显示我想要更改的行,然后我没有工作stream程来自动更改这些行。

我正在寻找一种自动化的方式(希望使用Git工具)来做到这一点。 我希望有某种“混帐”或相当的,但我找不到任何。

我在想的接口会很好:git sed's / old-method-name / new-method-name / g'

你可以做一个

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 

坚持在一个文件的地方,然后将其别名为git sed在您的配置。

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

你可以将git ls-filesxargssed结合使用:

 git ls-files -z | xargs -0 sed -i -e 's/old-method-name/new-method-name/g' 

感谢Noufal和Greg的职位。 我结合他们的解决方案,并找到一个使用git grep(比我的回购更健壮的比git ls-文件,因为它似乎只列出其中有实际的src代码的文件 – 例如,不是子模块文件夹),也旧的方法名称和新的方法名称只在一个地方:

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

 sed = ! git grep -z --full-name -l '.' | xargs -0 sed -i -e 

使用:

 git sed 's/old-method-name/new-method-name/ig' 

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

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

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

使用:

 git psed old_method_name new_method_name 

请注意,启动git 2.1(2014年第3季度) ,您可以为git grep默认设置“ full-name ”。
(见Andreas Schwab的 提交6453f7b )

git grep ”学习了grep.fullname配置变量来强制“ --full-name ”为默认值。
这可能会导致不希望出现这种新行为的脚本用户出现退步。

这意味着以前的解决方案可以受益于:

 git config grep.full-name true 

并使用:

 psed = !sh -c 'git grep --null --name-only --perl-regexp -e \"$1\" | xargs -0 perl -i -p -e \"s/$1/$2/g\"' - 

请参阅github上的git-search-replace – 它正是为此而设计的。

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

 $ sudo apt-get install git-extras 

使用它像波纹管如快速纠正拼写问题:

 $ git sed 'qoute' 'quote' 

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

 $ git grep -e 'class' -- '*.py' 

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