Git:以编程方式检查是否有任何进展

时间:2016-11-27 23:46:12

标签: git

对于我写作的Git脚本,我希望有一种编程方式来检查是否有任何进展。即如果有任何事情被上演,我想要一个积极的结果,如果没有上演,我想要否定。

奖励积分:一种以编程方式检查工作树中是否有可以暂存的新内容的方法。

3 个答案:

答案 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