首页 > 解决方案 > 使用管道在所有 git 分支中对所有同名文件的属性进行 grep

问题描述

我有一个按分支分隔的配置文件的 git 存储库,例如:

refs/heads/branch1, file - settings.properties
refs/heads/branch2, file - settings.properties

等等

我正在尝试 grep 每个settings.properties存储库中每个文件的某些属性:

git for-each-ref refs/heads --shell --format=‘%(refname:short)’ | xargs -n1 git checkout | cat settings.properties | grep ‘host.name’

第一个命令给了我我的分支列表,第二个命令一个接一个地检查每个分支,我希望第三个命令 cat 文件和第四个命令 grep 某些属性。前 2 个命令工作得很好,但如果我运行整个东西,它只会为第一个分支 greps host.name。

我显然遗漏了有关管道的一些重要内容。我知道我可以将它编写为 shell 脚本并在循环中执行所有这些操作,但我想保留“管道”方法,因为我可能经常需要cat不同的文件和grep不同的属性并且不想处理传递脚本中的参数

标签: linuxgitshellgit-plumbing

解决方案


您无需检查每个分支即可获取有关该文件的信息。您可以改为使用git cat-file在该分支上显示文件的内容。

所以你可以做一些这样的事情(未经测试):

git for-each-ref refs/heads --shell --format='%(refname:short)' | \
    xargs -n1 -I{} git cat-file blob {}:settings.properties | grep 'host.name'

或者,如果您希望它更短,您可以直接使用git grep

git for-each-ref refs/heads --shell --format='%(refname:short)' | \
    xargs -n1 -I{} git --no-pager grep host.name {}:settings.properties

推荐阅读