【问题标题】:Grep list of files returned from git status从 git status 返回的文件的 grep 列表
【发布时间】:2018-11-06 16:46:14
【问题描述】:

所以我正在尝试清理一个脚本,该脚本使用git status 获取当前暂存文件的列表,以返回每个暂存文件的相对文件路径。我查看了git status 的文档,看看是否有办法让它返回每个暂存文件的 absolute 路径,但似乎没有一个选项,并且git ls filesgit diff 将适用于此,因为特定用例是在合并期间。

在合并期间,使用 git diff 不会返回任何内容,而 git status 确实显示所有暂存文件,因此我无法使用 git status

从我拥有的这个列表中,我想通过文件列表 grep 提取包含字符串 "Path: " 的任何行并输出它。基本上,我有一个暂存的 .yml 文件列表,我想提取这些 yml 中对 Path 属性的所有更改。这是我到目前为止所拥有的:

IFS=$'\n'
for file in `git status -s -uno | sed s/^..//`
    do
        relativePath=$(echo $file | sed 's/^[ \t]*//;s/[ \t]*$//' | tr -d '"')
        startPath=`pwd`
        grep "Path: " "$startPath/$relativePath"
    done
unset IFS

解释:

git status -s -uno | sed s/^..//

  • 我将git status 的结果通过管道传送到sed 以删除任何多余的空格

relativePath=$(echo $file | sed 's/^[ \t]*//;s/[ \t]*$//' | tr -d '"')

  • 我回显文件路径并将其通过管道传输到sed,以删除在for 循环开始时未从初始sed 调用中删除的任何额外空格。然后,我将其通过管道传输到 tr 以从字符串中删除第一个和最后一个双引号,因为我需要将该相对路径与我的起始路径组合起来以获得完整路径。

startPath=`pwd`

grep "Path: " "$startPath/$relativePath"

  • 将当前工作目录存储在一个变量中,然后将它与我们的相对路径结合起来并传递给grep

这个脚本可以工作并提取我需要的数据,但我觉得有一种更简洁的方法可以做到这一点。有没有办法让git status返回每个暂存文件的完整路径,这样我就不必将我的第二个$startPath变量与$relativePath结合起来传递给grep

【问题讨论】:

标签: bash git


【解决方案1】:

最简单(正确)的方法是将git grepgit ls-files 结合使用。后者用作 grep 的选择器。

使用模式递归搜索修改后的跟踪文件:

git grep -r 'pattern' -- `git ls-files -m`

使用模式递归搜索所有跟踪文件:

git grep -r "pattern" .

请注意,此 grep 搜索不包括未跟踪的文件。您必须先添加它们,以便 git 可以看到它们。

【讨论】:

  • 尽管这个答案没有直接回答问题,但我认为这是更好的答案,因为它以更简单的方式解决了问题。
【解决方案2】:

由于您可能从 repo 内部调用 git status,所有路径都将与 $PWD 相关,因此您可以将其添加到位,是吗?

$: git status -s | sed "s@^[^ ]* @$PWD/@"

【讨论】:

    猜你喜欢
    • 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
    相关资源
    最近更新 更多