因此,我试图清理一个脚本,该脚本使用git status
返回当前已暂存文件的列表,以返回每个已暂存文件的相对文件路径。我查看了git status
的文档,以查看是否有一种方法可以使它返回每个已暂存文件的 absolute 路径,但是似乎没有选择和git ls files
或git 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
?
答案 0 :(得分:0)
由于您可能从存储库中调用git status
,所以所有路径都相对于$ PWD,所以您可以将其添加到位,是吗?
$: git status -s | sed "s@^[^ ]* @$PWD/@"
答案 1 :(得分:0)
最简单(正确)的方法是将git grep与git ls-files结合使用。后者用作grep的选择器。
使用某种模式对修改的跟踪文件进行递归搜索:
git grep -r 'pattern' -- `git ls-files -m`
使用某种模式对所有跟踪文件进行递归搜索:
git grep -r "pattern" .
请注意,此grep搜索不包括未跟踪的文件。您必须先添加它们,以便git可以看到它们。