Grep从git status返回的文件列表

时间:2018-11-06 16:46:15

标签: bash git

因此,我试图清理一个脚本,该脚本使用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中,以删除在sed循环开始时最初的for调用中未删除的所有多余空间。然后,我将其用管道插入tr中,以删除字符串中的第一个和最后一个双引号,因为我需要将该相对路径与我的起始路径结合起来以获得完整的路径。

startPath=`pwd`

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

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

此脚本可以工作并提取我需要的数据,但是我觉得我可以采用一种更简洁的方法。有没有办法让我git status返回每个已暂存文件的完整路径,所以我不必将我的第二个$startPath变量与传入的$relativePath合并grep

2 个答案:

答案 0 :(得分:0)

由于您可能从存储库中调用git status,所以所有路径都相对于$ PWD,所以您可以将其添加到位,是吗?

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

答案 1 :(得分:0)

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

使用某种模式对修改的跟踪文件进行递归搜索:

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

使用某种模式对所有跟踪文件进行递归搜索:

git grep -r "pattern" .

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