在 bash 脚本中,我想知道目录中是否有未暂存的文件。
我能得到的最接近的是检查退出代码:
git ls-files --other --error-unmatch --exclude-standard --directory "$folder/" > /dev/null 2>&1
有两个缺点。
- 我必须使用不同的命令来检查文件是否已取消暂存(因为斜杠)
- 这将在退出之前将所有文件打印到
/dev/null
,这在某些存储库上可能需要很长时间
理想情况下,我希望有一种方法让它在发现未跟踪的文件后立即停止 - 我不需要知道它们是什么,只要它们在那里就可以
最佳答案
如果您对 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='\0' -v dir="$dir" 'index($2, dir) == 1 { found = 1; exit } END { exit !found }'
要过滤掉未跟踪的文件,您可以添加对 `$1 != "??"的检查:
git status -z | awk -v RS='\0' -v dir="$dir" '$1 != "??" && index($2, dir) == 1 { found = 1; exit } END { exit !found }'
关于Git 管道 - 快速找出目录中是否有未暂存的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39075064/