10

我安装了 git 和 git-flow 完成,将这些行添加到 .bashrc 的 root 和 Ubuntu 12.04 机器上的 normal_user:

source /etc/git-completion.bash
source /etc/git-flow-completion.bash
GIT_PS1_SHOWUPSTREAM="verbose"
GIT_PS1_SHOWDIRTYSTATE=true
PS1='\[\033[32m\]\u@\h\[\033[00m\]:\[\033[34m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\$ '

当我以 root 或 normal_user 身份登录时,git 完成工作。但是,如果我使用“sudo -s”或“sudo su”,则 git 完成功能不起作用,并且每次按回车键时都会不断收到“__git_ps1:找不到命令”。我试图删除“源”命令并使用“apt-get install bash-completion”(bash-completion 已经安装)。因此,即使没有 2 个来源,我也会得到完全相同的行为。

任何人都知道问题是什么以及如何使其工作?

4

6 回答 6

18

当您这样做时sudo su,它不会获取 users .bashrc。PS1 是从您执行此操作的用户继承的sudo su,但新的 shell 不知道在哪里可以找到___git_ps1

您需要通过执行来模拟登录sudo su -l

于 2012-07-26T11:56:39.123 回答
5

在您的情况下,它发生是因为 git-prompt.sh 文件未在终端启动时启动,可以find contrib/completion/git-prompt.sh在初始 git-core 文件中启动。

机器可能已经存在,用于搜索:

找到 ~ -name git-prompt.sh

可能会花费很多时间,因此最好指定而不是 / 搜索更准确,可能您猜到了可以找到的位置。什么时候可以找到,在你的 promt 更改表达式之前添加到 .bashrc 中,因为它是由我制作的,并说明了方法:

如果 [ -f $HOME/git/1.8.0/contrib/completion/git-prompt.sh ]; 然后

. $HOME/git/1.8.0/contrib/completion/git-prompt.sh

毕竟做:

. ~/.bashrc

于 2012-11-11T14:09:43.970 回答
4

提示功能于 2012 年 5 月 22 日从 git-completion.bash 拆分为 git-prompt.sh;你也需要source那个。Git 1.7.12 是第一个看到这一变化的版本。我在更新 git-completion.bash 时遇到了同样的问题。

于 2013-05-30T20:18:34.237 回答
4

假设您在以rootvia登录时没有 git 完成没有问题sudo su,那么避免尝试评估只是一点点 bash 功夫__git_ps1

您可以在提示中放置任何您想要的条件PS1(因此在 git 目录中它可以如何替换分支名称)。因此,只需将 git 内容包装在条件检查中,即您不是用户 id 0 ( root)。

PS1在您的导出语句中替换:

$(__git_ps1) 

$(if [ $(id -u) -ne 0 ]; then echo  $(__git_ps1) ; fi)

您在 OP 中的整个提示现在看起来像这样:

 PS1='\[\033[32m\]\u@\h\[\033[00m\]:\[\033[34m\]\w\[\033[31m\]$(if [ $(id -u) -ne 0 ]; then echo  $(__git_ps1) ; fi)\[\033[00m\]\$ '

现在在 shell 中,您应该能够sudo su没有错误消息。

于 2017-02-28T00:58:43.627 回答
0

如果您不想添加额外的标志-l(或不想别名 su 等),您也可以将 root 的 bashrc 更改为不使用__git_ps1.

例如,在我的/root/.bashrc我有(我喜欢让 root 是红色的):

export PS1='\[\e[1;31m\][\u@\h \W]# \[\e[0m\]'

基本上,只需复制PS1~/.bashrc或类似文件中的内容/root/.bashrc并删除对 __git_ps1 的任何引用。

理想情况下,您很少以 root 身份进行开发,因此不需要__git_ps1. 如果这样做(不建议),您可以将执行所需的所有代码复制__git_ps1/root/.bashrc.

于 2015-10-05T16:50:43.487 回答
-1

也许有点晚了,但是您可以在 PS1 中替换:

(__git_ps1)

(type -t __git_ps1 >& /dev/null && __git_ps1)

这将禁用调用 __git_ps1 当它不可用时,你可能无论如何都不需要超级用户。

于 2015-03-04T17:40:16.490 回答