对于一个Git剧本我写,我想有一个编程的方式来检查是否有任何事情上演。即我想要一个积极的结果,如果在所有的事情正在上演,而负如果不上演。
加分点:一种以编程方式检查是否存在这样可以转移工作树新事物。
您正在寻找:
git diff --cached --quiet
(或--quiet
更换--exit-code
如果你仍然想输出)
所述git status
(在helppage git status --help
还解释)命令的短格式输出给出可以编程的方式被使用的输出。从git status --help
helppage(某处在页面中的“输出” -section底部,我的Git版本2.8.1.windows.1):
在短格式中,每个路径的状态被示出为
XY PATH1 -> PATH2
其中PATH1是头部中的路径,而“ - > PATH2”部分中示出,只有当PATH1对应于索引/ worktree不同的路径(即,文件被重命名)。该XY是两个字母的状态码。
据同helppage:
对于合并冲突路径,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 "^??"
希望这可以帮助。
祝好运!
这基本上是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