在bash脚本中,我想知道目录中是否有未分级的文件。
我能得到的最接近的是检查这个的退出码:
git ls-files --other --error-unmatch --exclude-standard --directory "$folder/" > /dev/null 2>&1
有两个缺点。
- 我必须使用不同的命令来检查文件是否未分级(因为斜杠)
- 这将在退出之前将所有文件打印到
/dev/null
,这在某些repos上可能需要很长时间
理想情况下,我希望有一种方法可以让它在发现未跟踪的文件时立即停止-我不需要知道它们是什么,只需要知道它们是否存在
如果您对git命令满意,您可以管道到grep -q
,其返回代码将告诉您是否有输出:
git ls-files --other --exclude-standard --directory "$folder/" | grep -q .
grep一旦接收到任何输入,匹配模式.
并成功退出。
为了抑制错误输出,您可以将整个内容用花括号{ }
括起来,并在末尾加上2>/dev/null
。
另一个选项是解析git status
的输出。例如,要查看输出中是否有文件的路径以$directory
开头,可以使用以下命令:
git status --porcelain | awk -v dir="$dir" 'index($2, dir) == 1 { found = 1; exit } END { exit !found }'
如果您的awk版本支持将记录分隔符设置为空字节,则可以使用git status -z
代替:
git status -z | awk -v RS=' ' -v dir="$dir" 'index($2, dir) == 1 { found = 1; exit } END { exit !found }'
要过滤掉未跟踪的文件,您可以添加一个检查' $1 != "??":
git status -z | awk -v RS=' ' -v dir="$dir" '$1 != "??" && index($2, dir) == 1 { found = 1; exit } END { exit !found }'
不确定是更快还是更慢,但git clean -n
会列出未分级的文件。
这并不能解决"一旦找到第一个未分级文件就停止"的问题,但似乎没有好的方法可以做到这一点。