Git:以编程方式检查是否暂存了任何内容

xj3cbfub  于 2023-02-11  发布在  Git
关注(0)|答案(3)|浏览(269)

对于我正在写的Git脚本,我希望有一个程序化的方法来检查是否有任何东西被暂存。也就是说,如果有任何东西被暂存,我希望得到一个正的结果,如果没有任何东西被暂存,我希望得到一个负的结果。
加分:一种以编程方式检查工作树中是否存在可暂存的新内容的方法。

jgzswidk

jgzswidk1#

您正在寻找:

git diff --cached --quiet

(or如果仍需要输出,请将--quiet替换为--exit-code

vd8tlhqk

vd8tlhqk2#

git status命令1的短格式输出提供了一个可以编程方式使用的输出:

短格式

在短格式中,每条路径的状态显示为以下形式之一

XY PATH
XY ORIG_PATH -> PATH

其中ORIG_PATH是重命名/复制的内容的来源。ORIG_PATH仅在重命名或复制条目时显示。XY是两个字母的状态代码。
再往下看,该文档的一个更老(更容易引用)版本2说:
对于具有合并冲突的路径,XY显示合并的每一端的修改状态。对于没有合并冲突的路径,X显示索引的状态,Y显示工作树的状态。对于未跟踪的路径,XY??。其他状态代码可解释如下:

*''=未修改
*M=修改
*T=文件类型已更改(常规文件、符号链接或子模块)2
*A=已添加
*D=删除
*R=重命名
*C=已复制(如果配置选项status.renames设置为“copies”)2
*U=已更新但未合并

忽略的文件不会列出,除非--ignored选项有效,在这种情况下XY!!
使用git status -s可以获得短格式。这将为您提供到目前为止已暂存的所有条目:

git status -s | grep "^[MTADRCU]"

您还可以将-c标志添加到grep以计算行数,而不是打印行数。

**额外好处:**工作树中尚未暂存(仍未跟踪)的任何新内容都可以通过以下方式找到:

git status -s | grep "^??"

1此文本也可作为帮助页在git status --help上找到。
[2]最新版本的文档不够简洁,因为在合并冲突方面使用了更明确的语言。我已经标记了在引用版本之后的Git版本中添加或修改的代码。

jogvjijk

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

相关问题