我如何检查我的git存储库中是否有任何未提交的更改:

添加到索引但未提交的更改 无路径的文件

从一个脚本?

git-status在git 1.6.4.2版本中似乎总是返回0。


当前回答

我使用最简单的自动测试来检测脏状态=任何更改,包括未跟踪的文件:

git add --all
git diff-index --exit-code HEAD

备注:

如果没有add——all, diff-index不会注意到未跟踪的文件。 通常情况下,我在测试错误代码后运行git重置来取消所有内容。 考虑用quiet代替exit-code来避免输出。

其他回答

这是最好、最干净的方法。由于某些原因,所选的答案对我不起作用,它没有拾取未提交的新文件所进行的更改。

function git_dirty {
    text=$(git status)
    changed_text="Changes to be committed"
    untracked_files="Untracked files"

    dirty=false

    if [[ ${text} = *"$changed_text"* ]];then
        dirty=true
    fi

    if [[ ${text} = *"$untracked_files"* ]];then
        dirty=true
    fi

    echo $dirty
}

@eduard- wch的回答很完整,但因为我想同时检查两者,这里是我的最后一个变体。

        set -eu

        u="$(git ls-files --others)"
        if ! git diff-index --name-only --quiet HEAD -- || [ -z "${u:-}" ]; then
            dirty="-dirty"
        fi

当不使用set -e或类似的方法执行时,我们可以执行u="$(git ls-files——others)"|| exit 1(如果对已使用的函数有效,则返回)

因此,untracked_files仅在命令成功时设置。

之后,我们可以检查这两个属性,并设置一个变量(或任何东西)。

你也可以

git describe --dirty

. 如果它检测到一个肮脏的工作树,它将在结尾附加单词“-dirty”。根据git-describe(1):

   --dirty[=<mark>]
       Describe the working tree. It means describe HEAD and appends <mark> (-dirty by default) if
       the working tree is dirty.

. 注意:未跟踪的文件不被认为是“脏文件”,因为,正如manpage声明的那样,它只关心工作树。

为什么不封装'git状态与一个脚本:

将分析该命令的输出 是否会根据需要返回适当的错误代码

这样,您就可以在脚本中使用“增强”状态。


正如0xfe在他的精彩回答中提到的,git状态—瓷器在任何基于脚本的解决方案中都是重要的

--porcelain

为脚本提供稳定、易于解析的输出格式。 目前这与——short输出相同,但保证将来不会更改,因此对脚本是安全的。

看了一下这些答案…(在*nix和windows上有各种问题,这是我的要求)…发现以下方法效果很好…

git diff --no-ext-diff --quiet --exit-code

检查*nix中的退出代码

echo $?   
#returns 1 if the repo has changes (0 if clean)

查看窗口$中的退出代码

echo %errorlevel% 
#returns 1 if the repos has changes (0 if clean) 

来源:https://github.com/sindresorhus/pure/issues/115 感谢@paulirish的分享