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
联合xargs
和sed
:
git ls-files -z | xargs -0 sed -i -e 's/old-method-name/new-method-name/g'
Run Code Online (Sandbox Code Playgroud)
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重复产生.
这是一个结合了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)
是的,有。在 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 和其他操作系统上也存在相同的功能。查看其安装页面。