提示不更新git分支

我试图将当前的git分支集成到我的提示符中,但它的行为并不如预期。我正在使用ubuntu 16.04上的bash和git 2.7.4。 当我启动终端时,没有显示任何git信息。如果我从存储库内部源自我的.bashrc文件,则会显示分支,但不再更新。这是我在我的.bashrc文件中写的内容:
green="\[\033[01;32m\]"
blue="\[\033[01;34m\]"
no_color="\[\033[00m\]"
purple="\[\033[01;35m\]"

source ~/.git-prompt.sh
export PS1="$purple\u $green$(__git_ps1 " (%s)") $blue\W $no_color \$ "

更新:

我尝试按照git-prompt中的说明进行操作,但结果仍然相同。然而,如果我只是复制git-prompt中的建议:PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ ',它可以工作,但当然不符合我的要求。我是否遗漏了一些语法错误?即使不使用export,模板PS1也可以工作,只需PS1=...

3个回答

好的,我找到了解决方案。不需要使用提示命令。这个错误是由于语法错误引起的。
如果我将PS1的内容赋值为"",以便使用我的变量来设置颜色,它只在源码.bashrc时执行__git_ps1函数。
但是,如果我将PS1的内容赋值为'',并且不使用颜色变量,而是直接写出代码,它会按预期工作。根据我在这里阅读到的信息,似乎最好的做法是不将PS1导出到环境中。
所以解决方案如下:
PS1='\[\033[01;35m\]\u \[\033[01;32m\]$(__git_ps1 " (%s)") \[\033[01;34m\]\W \[\033[00m\] \$ '

然而,我很好奇知道这背后的原因是什么。在 macOS 中,它可以在双引号内正常工作。

它确实有效,谢谢。但是当你将颜色设置为变量时,这真的很麻烦。 - Paulo Pedroso
很高兴它对你有用。然而,在此期间,我已经将shell切换到zsh。zsh与oh-my-zshell结合起来更加美观和方便。我建议使用zsh,并选择一个你喜欢的shell提示主题。 - Picard
1奇怪。只需用单引号而不是双引号将其包围起来似乎可以解决这个问题。 - chiliNUT

遇到了同样的问题。你可以简单地将$(...)转义为\$(...)
export PS1="$purple\u $green\$(__git_ps1 " (%s)") $blue\W $no_color \$ "

同意。这里有一个更详细的解释:https://stackoverflow.com/a/5380073/135101。 - Tyler Collier
这是问题,谢谢。 - mouchin777

那是因为.bashrc只会被读取一次:当你启动一个新的交互式非登录shell时(例如打开一个新的终端)。所以PS1是在你第一次打开终端时设置的,之后就不会再改变了。
正确的做法(假设你的git-prompt和__git_ps脚本按预期工作)是使用PROMPT_COMMAND。如man bash中所解释的那样:
   PROMPT_COMMAND
          If set, the value is executed as a command prior to issuing each
          primary prompt.

您希望在显示每个提示之前(即在运行每个命令后,例如运行`cd`命令后)都运行`__git_ps1`。因此,您需要将其放入`PROMPT_COMMAND`中。如果您的`__git_ps1`是我认为的那样,它将为您设置`PS1`。您只需要在每次显示提示时运行它。因此,请将以下行添加到您的`~/.bashrc`文件中:
PROMPT_COMMAND="$purple\u $green$(__git_ps1 "(%s)") $blue\W $no_color \$ "

最后,我不能确定,因为你没有展示相关的脚本,但我非常怀疑在那里使用`(%s)`是有意义的。那只会打印字符串`%s`。如果你需要更多帮助,请编辑你的问题并且:i) 包括`__git_ps1`和`/etc/bash_completion.d/git-prompt`(或者告诉我们它们是如何安装的,如果它们来自于Ubuntu软件包),ii) 展示给我们你的提示符应该是什么样子的。

我更新了我的问题。我知道.bashrc只会被读取一次,但是无论如何提示符应该每次都更新。 - Picard
@Pepe除非使用我在答案中解释的PROMP_COMMAND,否则它不会起作用。你尝试了吗? - terdon
谢谢你的回答,但是你走错了方向。而且%s并不是多余的。我在下面发布了解决方案。 - Picard