2016-02-13 66 views
4

我有一個bash PS1獲得紅色,如果我的git目錄更改或綠色,如果沒有更改。獲取git狀態布爾沒有緩慢的差異列表

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 status --shortgit status --porcelain但速度很慢但更好的辦法讓git的狀態布爾(是改變或不改變)。

+0

我推薦[posh git](https://github.com/dahlbyk/posh-git)而不是自己做這個。它像你描述的那樣做,但也有更多。 – adrianbanks

回答

1

也許這個答案可能是有用的: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 
0

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

這是非常快,但如果你有一個未跟蹤文件,你將有一個changed==0布爾,但對我很好。

git_ps1_style() 
{ 
    local GREEN="\001\033[0;32m\002" 
    local RED="\001\033[0;91m\002" 
    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)