对于我正在写的Git脚本,我希望有一个程序化的方法来检查是否有任何东西被暂存。也就是说,如果有任何东西被暂存,我希望得到一个正的结果,如果没有任何东西被暂存,我希望得到一个负的结果。加分:一种以编程方式检查工作树中是否存在可暂存的新内容的方法。
jgzswidk1#
您正在寻找:
git diff --cached --quiet
(or如果仍需要输出,请将--quiet替换为--exit-code)
--quiet
--exit-code
vd8tlhqk2#
git status命令1的短格式输出提供了一个可以编程方式使用的输出:
git status
在短格式中,每条路径的状态显示为以下形式之一
XY PATH XY ORIG_PATH -> PATH
其中ORIG_PATH是重命名/复制的内容的来源。ORIG_PATH仅在重命名或复制条目时显示。XY是两个字母的状态代码。再往下看,该文档的一个更老(更容易引用)版本2说:对于具有合并冲突的路径,X和Y显示合并的每一端的修改状态。对于没有合并冲突的路径,X显示索引的状态,Y显示工作树的状态。对于未跟踪的路径,XY为??。其他状态代码可解释如下:
ORIG_PATH
XY
X
Y
??
*''=未修改*M=修改*T=文件类型已更改(常规文件、符号链接或子模块)2*A=已添加*D=删除*R=重命名*C=已复制(如果配置选项status.renames设置为“copies”)2*U=已更新但未合并
status.renames
忽略的文件不会列出,除非--ignored选项有效,在这种情况下XY为!!。使用git status -s可以获得短格式。这将为您提供到目前为止已暂存的所有条目:
--ignored
!!
git status -s
git status -s | grep "^[MTADRCU]"
您还可以将-c标志添加到grep以计算行数,而不是打印行数。
-c
grep
**额外好处:**工作树中尚未暂存(仍未跟踪)的任何新内容都可以通过以下方式找到:
git status -s | grep "^??"
1此文本也可作为帮助页在git status --help上找到。[2]最新版本的文档不够简洁,因为在合并冲突方面使用了更明确的语言。我已经标记了在引用版本之后的Git版本中添加或修改的代码。
git status --help
jogvjijk3#
这基本上是J.Baoby's answer的一个实际示例,我在一组存储库上循环运行类似这样的代码,以获取每个存储库中未提交文件的摘要。
function ordered_count() { # modified from https://superuser.com/a/529837/23156 # echo "$data" | ordered_count -c foo -c bar awk -F' ?-c ' ' BEGIN { split("'"$*"'", pattern) } { for (i = 2; pattern[i]; ++i) if (match($0, pattern[i])) ++count[i] } END { for (i = 2; pattern[i]; ++i) print count[i] } ' } # The `$@` is so you can add extra args, e.g. `-- important/path` gitstatus=$(git status --short --untracked-files=all --no-ahead-behind $@) # Staged changes mapfile -t staged_added_removed_changed < <( echo "$gitstatus" | ordered_count \ -c "^A" \ -c "^D" \ -c "^[MRU]" ) # Unstaged changes mapfile -t unstaged_added_removed_changed < <( echo "$gitstatus" | ordered_count \ -c '^([ C]A|\\?\\?)' \ -c "^ D" \ -c "^ [MRU]" ) # Do stuff with the arrays
3条答案
按热度按时间jgzswidk1#
您正在寻找:
(or如果仍需要输出,请将
--quiet
替换为--exit-code
)vd8tlhqk2#
git status
命令1的短格式输出提供了一个可以编程方式使用的输出:短格式
在短格式中,每条路径的状态显示为以下形式之一
其中
ORIG_PATH
是重命名/复制的内容的来源。ORIG_PATH
仅在重命名或复制条目时显示。XY
是两个字母的状态代码。再往下看,该文档的一个更老(更容易引用)版本2说:
对于具有合并冲突的路径,
X
和Y
显示合并的每一端的修改状态。对于没有合并冲突的路径,X
显示索引的状态,Y
显示工作树的状态。对于未跟踪的路径,XY
为??
。其他状态代码可解释如下:*''=未修改
*M=修改
*T=文件类型已更改(常规文件、符号链接或子模块)2
*A=已添加
*D=删除
*R=重命名
*C=已复制(如果配置选项
status.renames
设置为“copies”)2*U=已更新但未合并
忽略的文件不会列出,除非
--ignored
选项有效,在这种情况下XY
为!!
。使用
git status -s
可以获得短格式。这将为您提供到目前为止已暂存的所有条目:您还可以将
-c
标志添加到grep
以计算行数,而不是打印行数。**额外好处:**工作树中尚未暂存(仍未跟踪)的任何新内容都可以通过以下方式找到:
1此文本也可作为帮助页在
git status --help
上找到。[2]最新版本的文档不够简洁,因为在合并冲突方面使用了更明确的语言。我已经标记了在引用版本之后的Git版本中添加或修改的代码。
jogvjijk3#
这基本上是J.Baoby's answer的一个实际示例,我在一组存储库上循环运行类似这样的代码,以获取每个存储库中未提交文件的摘要。