如果我的 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 --short
或git 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=" 01 33[0;32m 02"
local RED=" 01 33[0;91m 02"
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)