使用 GIT_PS1_SHOWCOLORHINTS 自定义 __git_ps1 的颜色

问题描述 投票:0回答:3

我尝试过的事情

我已使用

__git_ps1
更新了提示以包含分支名称。另外,我设置了
GIT_PS1_SHOWCOLORHINTS

问题

提示正确显示。然而,树枝的颜色始终是绿色的。我预计脏树枝会是红色的。

文档指出:

颜色基于“git status -sb”的彩色输出

我发现并审查了如何对 git-status 输出进行着色?但我不确定我需要更改哪些选项...

问题

是否可以将clean分支的分支颜色更改为绿色,将dirty分支更改为红色?如果是的话,怎么办?

git shell command-prompt
3个回答
17
投票

脏分支的

__git_ps1
显示的颜色不影响分支名称;它们影响“脏状态指示器”。除了启用颜色之外,如果启用此指示器,您将看到脏分支的红色星号:

old-prompt $ bash --noprofile --norc
bash-4.2$ source /etc/bash_completion.d/git-prompt
bash-4.2$ export GIT_PS1_SHOWCOLORHINTS=1
bash-4.2$ export GIT_PS1_SHOWDIRTYSTATE=1
bash-4.2$ export PROMPT_COMMAND='__git_ps1 "\u@\h:\w" "\\\$ "'
chris@machine:~/path/to/dir (master *)$

如果不修改

git-prompt.sh
代码或提供自己的函数,就无法根据脏状态更改分支名称的颜色。

请注意,这适用于

export PROMPT_COMMAND
,但不适用于
export PS1


3
投票

我能够通过以下方式实现一个不错的解决方案:
1. 克隆最新的 git 源,获取并安装最新的

git-prompt.sh
(您的发行版可能已经有最新的脚本)
2. 删除阻止脚本在输出字符串中插入颜色代码的检查。
3. 更改我的 .bashrc 以包含对
__git_ps1
的调用以及一些格式选项来更改我的终端提示文本。

提交和文档,包括我所做的特定文件和编辑:https://github.com/karlapsite/git/commit/b34d9e8b690ec0b304eb794011938ab49be30204#diff-a43cc261eac6fbcc3578c94c2aa24713R449

现在,我的控制台拥有我想要的所有信息:我可以打开终端,然后 cd 进入任何 git 存储库:

$ cd ~/Github/git
user@hostname:~/Github/git:(master)$ # 'master' is green

当我签出哈希值并进入分离头状态时:

$ git checkout bca18110
user@hostname:~/Github/git:(bca1811...)$ # the commit hash is red

我需要遵循这个答案:https://stackoverflow.com/a/13997892/4717806让bash在每个命令后正确地重新解释颜色代码,但我的终端完好无损,换行仍然有效,并且我的提示符颜色是我想要的!


0
投票

我解决这个问题的方法是编写一个简短的格式化函数,其中:

  1. 适用于 PS1
  2. 连树枝都上色了
  3. 自定义要包含的消息/注释
  # Craft some nice coloured git status
  __fancy_git_status() {
    local STATUS COLOR NOTE GIT_PS
    STATUS=$(git status -sb --ignore-submodules)
    GIT_PS=$(if test $? -eq 0; then
      if grep -q '^A' <<<"$STATUS"; then
        COLOR=${COLOR_INTENSE_GREEN}
        NOTE=" ${COLOR_YELLOW}staged 4 commit$COLOR"
      elif grep -q '^ M' <<<"$STATUS"; then
        COLOR="${COLOR_GREEN}"
        NOTE=" ${COLOR_ORANGE}with changes$COLOR"
      else
        COLOR="${COLOR_INTENSE_GREEN}"
      fi
      __git_ps1 "${GIT_PS1_PREFIX}$COLOR⎇  %s${NOTE:-}"
    fi)
    test -n "$GIT_PS" && echo "$GIT_PS" || echo -e "${GIT_PS1_PREFIX}${COLOR_GRAY}not found"
  }

  PS1="..."  # Your preferred PS1 preceding the git information

  PS1+="\n"
  PS1+="${COLOR_DARK_GREEN}\$(__fancy_git_status)\n${COLOR_RESET}"

  PS1+="\\$ "

这是我的终端中带有干净分支的样子:

肮脏,但不上演:

暂存提交:

© www.soinside.com 2019 - 2024. All rights reserved.