我正在使用 Gnome 终端通过 SSH 连接到我的服务器。我在远程服务器(Ubuntu)上的帐户使用 bash。我的 bashrc 包含一行设置 shell 提示符以包含我当前的 git 分支(如果适用):
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1="\u@\h: \[\033[32m\]\w\[\033[00m\]\$(parse_git_branch)\$ "
当我进入 git 存储库时,我的终端停止正确包装。长命令应该换行到第二行,而不是换行到它们开始的行的开头,并在我的提示符上方开始打印。
除非我的工作目录位于 git 存储库内(即,当parse_git_branch
的输出不为空时),否则我不会遇到包装问题。
我知道不可打印的字符应包含在\[
和 中\]
这样 shell(或终端?)就知道不要将它们计入提示符的长度。我相当有信心“导出”行已正确完成此操作...但我的 regex-fu 不够强大,无法理解 sed 命令正在做什么,而且我认为它没有正确插入不可打印的字符。
这个问题非常相似(甚至使用相同的parse_git_branch
函数,我们从这里),但另一个问题涉及提示中包含表情符号,但我的情况并非如此。
有谁知道我的提示有什么问题吗?
答案1
事实证明,这是因为我启用了color=always
git 中的 ui 选项,而不是直接因为我的 shell 提示符或parse_git_branch
函数。“git branch”命令显示有颜色,但该parse_git_branch
函数的原始作者没有考虑到这一点,而是将字符串切碎,导致颜色代码无法正确关闭。
将标志添加--no-color
到函数内部的“git分支”命令parse_git_branch
足以解决问题,但我实际上已经习惯了这些颜色——所以这里是如何复制金色背景:
parse_git_branch() {
git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1="\u@\h: \[\033[32m\]\w\[\033[00m\]\[\033[7m\033[33m\]\$(parse_git_branch)\[\033[00m\]$ "
答案2
当你安装 git 包时。它应该安装一个本地文件,您可以获取该文件,该文件内置了分支解析。您尝试过使用它吗?我用这个没有任何问题。这是从 RHEL 获取的,因此 git-prompt.sh 可能位于 ubuntu 上的不同位置。只需执行“locate git-prompt.sh”,或者看起来这里有一个版本:https://github.com/magicmonty/bash-git-prompt
. /usr/share/git-core/contrib/completion/git-prompt.sh
export PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '