在 bash 中显示 git 分支的脚本在 ubuntu 18.04 上不再起作用

在 bash 中显示 git 分支的脚本在 ubuntu 18.04 上不再起作用

在我的 16.04 安装中我将其放入我的~/.bashrc文件中:

#Show git branch in commandline
parse_git_branch() {
     git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1="${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u:\[\033[01;34m\]\w\[\033[00m\]\$(parse_git_branch)\[\033[00m\] $ "

它显示了如下提示:

user:~/myrepo (master) $

但是当我在 18.04 上执行相同操作时,提示符却如下所示:

user:~/myrepo $ 

我如何让它在 18.04 中运行?

$ printf "%q\n" "$PS1" "$PROMPT_COMMAND" "$0" "$SHELL"
\\\[\\033\[01\;32m\\\]\\u:\\\[\\033\[01\;34m\\\]\\w\\\[\\033\[00m\\\]\$\(parse_git_branch\)\\\[\\033\[00m\\\]\ \$\ 
''
bash
/bin/bash

我正在使用sed (GNU sed) 4.4GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)。这是“全新”安装,因此 中没有任何额外内容.bashrc

答案1

虽然你已经解决了这个问题,但我还是想介绍一下 git 已经提供的解决方案:

该文件与 git 一起/usr/lib/git-core/git-sh-prompt安装。几年前,它位于贡献目录,但与此同时,它进入了官方路径。该文件不是要执行的(事实上,它没有x标志),而是要来源来自.bashrc。它定义了一些函数来处理漂亮的提示,其中最突出的是__git_ps1

您可以将以下几行添加到您的.bashrc

source /usr/lib/git-core/git-sh-prompt
export PS1="${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u:\[\033[01;34m\]\w\[\033[00m\]\$(__git_ps1)\[\033[00m\] $ "

该文件的顶部/usr/lib/git-core/git-sh-prompt给出了一些关于还可以做什么的描述。我的版本说1) Copy this file to somewhere (e.g. ~/.git-prompt.sh).但这不是必要的(该说明已过时)。

你也可以设置一些环境变量来改变函数的行为。例如,我使用

export GIT_PS1_SHOWDIRTYSTATE=yes

结果如下:

# clean
pduck:~/oss/rsyslog (master) $ 

或者

# dirty
pduck:~/oss/rsyslog (master *) $ 

或者

# something added to index
pduck:~/oss/rsyslog (master +) $ 

或者

# in a completely fresh repo
pduck:~/oss/xxx (master #) $ 

顺便说一句:获取当前分支的“正确”方法不是解析git branch的输出,因为这可能会随着新的 git 版本而改变。 git branch是所谓的命令,这意味着它的输出很漂亮,但不能保证在不同版本中保持一致。因此,git 人员建议管道脚本工具。使用管道当前分支可以通过以下方式确定:

if [ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]; then
    current_branch=$(git symbolic-ref --quiet --short HEAD || git rev-parse --short HEAD)
else
    current_branch=""
fi

如果 HEAD 是符号引用(即:签出分支或标记),则第一个赋值有效。如果您签出的内容没有标签(例如git checkout HEAD^^),则它失败,我们改用git rev-parse --short HEAD显示 SHA1。if检查我们是否处于 git 工作目录中(因为否则命令没有任何意义)。

答案2

解决方案非常简单。

我设置了上游,暂存了提交并推送了它。之后它就正常工作了。

我认为该脚本以某种方式使用了.git生成的文件夹git init。因为它可以在没有上游的分支上运行。

答案3

补充 @PerlDuck 的答案,这里介绍如何使用彩色 git 提示来获得旧式提示。只需将这些行添加到文件.bashrc

source "/usr/lib/git-core/git-sh-prompt"
export GIT_PS1_SHOWDIRTYSTATE=yes
export GIT_PS1_SHOWUPSTREAM=yes
export GIT_PS1_SHOWCOLORHINTS=yes
PROMPT_COMMAND='__git_ps1 "\u@\h:\w" " \\\$ "'

相关内容