对于我写作的Git脚本,我希望有一种编程方式来检查是否有任何进展。即如果有任何事情被上演,我想要一个积极的结果,如果没有上演,我想要否定。
奖励积分:一种以编程方式检查工作树中是否有可以暂存的新内容的方法。
答案 0 :(得分:3)
git status
的短格式输出(也在helppage git status --help
中说明)命令提供了可以以编程方式使用的输出。从git status --help
helppage(" OUTPUT" -section中页面底部的某处,对于我的git版本2.8.1.windows.1):
在短格式中,每条路径的状态显示为
XY PATH1 -> PATH2
其中PATH1是HEAD中的路径,而" - > PATH2"仅当PATH1对应于索引/工作树中的不同路径(即重命名文件)时才显示部分。 XY是两个字母的状态代码。
根据同样的支持:
对于具有合并冲突的路径,X和Y显示合并每一侧的修改状态。对于没有合并冲突的路径,X显示索引的状态,Y显示工作树的状态。对于未跟踪的路径,
XY
为??
。其他状态代码可以解释如下:
' '
=未经修改的M
=已修改
A
=已添加
D
=已删除
R
=重命名为C
=已复制
U
=已更新但未合并 除非--ignored选项生效,否则列出忽略的文件,在这种情况下XY
为!!
。
还可以找到有关XY
值的所有信息here。
使用git status -s
获得短格式。
所以
git status -s | grep "^[MADRCU]"
应该为您提供迄今已上演的所有参赛作品。您可以将-c
标志添加到grep以计算行而不是打印它们。
奖励:工作树中尚未上演的任何新内容(仍然没有跟踪)应该找到:
git status -s | grep "^??"
希望这会有所帮助。
祝你好运!答案 1 :(得分:3)
您正在寻找:
git diff --cached --quiet
(如果您还想要输出,请将--quiet
替换为--exit-code
)
答案 2 :(得分:0)
这基本上是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