Git管道-快速查找目录中是否有未分级的文件

  • 本文关键字:是否 文件 管道 查找 Git git bash
  • 更新时间 :
  • 英文 :


在bash脚本中,我想知道目录中是否有未分级的文件。

我能得到的最接近的是检查这个的退出码:

git ls-files --other --error-unmatch --exclude-standard --directory "$folder/" > /dev/null 2>&1

有两个缺点。

  1. 我必须使用不同的命令来检查文件是否未分级(因为斜杠)
  2. 这将在退出之前将所有文件打印到/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会列出未分级的文件。

这并不能解决"一旦找到第一个未分级文件就停止"的问题,但似乎没有好的方法可以做到这一点。

最新更新