混帐:编程方式检查是否有任何正在上演

问题描述 投票:5回答:3

对于一个Git剧本我写,我想有一个编程的方式来检查是否有任何事情上演。即我想要一个积极的结果,如果在所有的事情正在上演,而负如果不上演。

加分点:一种以编程方式检查是否存在这样可以转移工作树新事物。

git
3个回答
3
投票

您正在寻找:

git diff --cached --quiet

(或--quiet更换--exit-code如果你仍然想输出)


3
投票

所述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 "^??"

希望这可以帮助。

祝好运!


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
© www.soinside.com 2019 - 2024. All rights reserved.