获取 git 状态布尔值,没有慢速差异列表



如果我的 git dir 被更改,我有一个 bash PS1 可以获得红色,如果没有更改,则获得绿色。

if [ $? -eq 0 ]; then 
   echo "$(echo `git status` | grep "nothing to commit" > /dev/null 2>&1; 
   if [ "$?" -eq "0" ]; then 
     # @4 - Clean repository - nothing to commit
     echo "n'$Green'"$(__git_ps1 "(%s)"'$Color_Off'); 
   else 
     # @5 - Changes to working tree
     echo "n'$IRed'"$(__git_ps1 "(%s)"'$Color_Off'); 
   fi)$ "; 
 fi)'

这工作正常!但问题是,在某些工作中,目录非常慢,因为存在许多变化和很大的差异。

在没有完整状态的情况下获取 git 状态布尔值(是已更改或未更改(的更好方法

我尝试了git status --shortgit status --porcelain但速度很慢。

也许这个答案可能有用:https://stackoverflow.com/a/2659808/3903076

简而言之,您可以根据需要调整以下检查。有关更多详细信息,请参阅链接的答案。

if ! git diff-index --quiet --cached HEAD; then
    # Index has changes.
    exit 1;
elif ! git diff-files --quiet; then
    # Working tree has changes.
    exit 1;
elif [ -n "`git ls-files --others --exclude-standard`" ]; then
    # There are untracked unignored files.
    exit 1;
fi

我在这里找到了答案:https://gist.github.com/sindresorhus/3898739 git diff --quiet --ignore-submodules HEAD 2>/dev/null

这非常快,但是如果您有一个未跟踪的文件,您将有一个changed==0布尔值,但对我来说很好。

git_ps1_style ()
{
    local GREEN="0133[0;32m02"
    local RED="0133[0;91m02"
    local git_branch="$(git rev-parse --abbrev-ref HEAD 2>/dev/null)";
    local git_ps1_style="";
    if [ -n "$git_branch" ]; then
        (git diff --quiet --ignore-submodules HEAD 2>/dev/null)
        local git_changed=$?
        if [ "$git_changed" == 0 ]; then
            git_ps1_style=$GREEN$git_branch;
        else
            git_ps1_style=$RED$git_branch;
        fi
    fi
    echo -e "$git_ps1_style"
}
echo $(git_ps1_style)