【问题标题】:Grep all the same name files' properties across all the git branches using pipelines使用管道在所有 git 分支中对所有同名文件的属性进行 grep
【发布时间】:2020-03-24 13:44:05
【问题描述】:

我有一个按分支分隔的配置文件的 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 不同的属性并且不会不想处理将参数传递到脚本中

【问题讨论】:

  • 您没有将cat 包装在循环中或使用xargs,所以它只会运行一次,您希望它在哪里为每个参考运行。

标签: linux git shell git-plumbing


【解决方案1】:

您无需检查每个分支即可获取有关该文件的信息。您可以改为使用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

【讨论】:

  • 第二个命令以交互方式完成了它(我每次都必须按“q”来遍历所有分支)。第一个给了我 git cat 文件的用法,我假设是因为 git cat-file 想要一个对象的哈希值。如果我试图将 git object-hash 添加到管道中,它不会切换分支。有任何想法吗?非常感谢您的帮助!
  • 我已将其编辑为使用git cat-file blob,这应该是正确的调用。您可以在那里使用任何任意 blob 表达式。如果您不想要寻呼机,可以在git grep 前加上env GIT_PAGER=cat,这将禁用寻呼机。
  • git --no-pager …
  • @bk2204 这两个选项都有效,非常感谢,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多