Git 管道 - 快速找出目录中是否有未暂存的文件

标签 git bash

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

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

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

有两个缺点。

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

相关文章:

git - 在 OSX Mountain Lion 下的 RStudio 中设置 git 可执行文件的路径

bash - bash 中的 $'\0' 是什么?

mysql - Dockerfile RUN read 命令给我错误

git - 推送到 git 存储库时管道损坏

asp.net - GIT + HTTP 跨网络失败

git - 使用 git 信息生成 git.properties 文件

git - 在 git 中显示提交者日期而不是作者日期

bash - 使用 Bash 将单个字节写入串口

python - 在 bash 脚本中运行参数化的 python 脚本

bash - 我似乎无法在 "-c"选项字符串之后使用带参数的 Bash "-c"选项