Git完成和PS1无法正常工作:Ubuntu 12.04上的“sudo -s”或“sudo su”上的“__git_ps1:command not found”

时间:2012-07-26 05:12:54

标签: git bash bash-completion

我安装了git和git-flow完成,将这些行添加到root的.bashrc和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:command not found”。 我试图删除“source”命令并使用“apt-get install bash-completion”(已经安装了bash-completion)。因此,即使没有2源,我也会得到完全相同的行为。

有人知道问题是什么以及如何使其发挥作用?

6 个答案:

答案 0 :(得分:15)

执行sudo su时,它不会向用户.bashrc提供内容。 PS1继承自您sudo su所做的用户,但新shell不知道它可以找到的位置___git_ps1

您需要通过执行sudo su -l

来模拟登录

答案 1 :(得分:5)

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

机器可能已存在,搜索:

  

找到〜-name git-prompt.sh

可能需要花费很多时间,因此最好指定而不是/搜索更精确,可能你猜测可以找到的地方。 什么时候会发现,在你的promt改变表达式之前添加.bashrc作为一个例子,因为它是由我做出的方式的指示:

  

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

     

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

     

网络连接

毕竟:

  

。的〜/ .bashrc

答案 2 :(得分:4)

The prompt functionality was split out of git-completion.bash into git-prompt.sh on May 22, 2012;你也需要source那个。 Git 1.7.12是第一个看到这种变化的版本。我在更新我的git-completion.bash时遇到了同样的问题。

答案 3 :(得分:2)

假设你通过import java.awt.Container; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.GridLayout; import java.awt.BorderLayout; import java.awt.Color; import javax.swing.*; @SuppressWarnings("serial") public class GUI extends JFrame implements ActionListener { private JTextField input; private JTextField output; private JRadioButton base2Button; private JRadioButton base10Button; private JButton convert; private JButton clear; private Container canvas = getContentPane(); private Color GRAY; public GUI() { this.setTitle("Base 10-2 calc"); this.setLayout(new FlowLayout(FlowLayout.LEFT)); //this.setLayout(new GridLayout(2,2)); base2Button = new JRadioButton( "Convert to base 2"); base10Button = new JRadioButton( "Convert to base 10"); ButtonGroup radioGroup = new ButtonGroup(); radioGroup.add(base2Button); radioGroup.add(base10Button); JPanel radioButtonsPanel = new JPanel(); radioButtonsPanel.setLayout( new FlowLayout(FlowLayout.LEFT) ); radioButtonsPanel.add(base2Button); radioButtonsPanel.add(base10Button); canvas.add(radioButtonsPanel); base2Button.setSelected( true ); base10Button.setSelected( true ); input = new JTextField(18); //input = new JFormattedTextField(20); canvas.add(input); output = new JTextField(18); //output = new JFormattedTextField(20); canvas.add(output); convert = new JButton("Convert!"); convert.addActionListener(this); canvas.add(convert); clear = new JButton("Clear"); clear.addActionListener(this); canvas.add(clear); output.setBackground(GRAY); output.setEditable(false); this.setSize(300, 200); this.setVisible(true); this.setLocation(99, 101); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { GUI app = new GUI(); app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } @Override public void actionPerformed(ActionEvent e) { String s = e.getActionCommand(); if(s.equals("Convert!")) { String numS = input.getText(); int numI = Integer.parseInt(numS); if(base2Button.isSelected()) { output.setText(Integer.toBinaryString(Integer.valueOf(numI))); } if(base10Button.isSelected()) { output.setText("" + Integer.valueOf(numS,2)); } } if(s.equals("Clear")) { input.setText(""); output.setText(""); } } } root身份登录时没有git完成,这只是一个小小的功夫,以避免尝试评估sudo su

您可以在__git_ps1提示符中放置任何类型的条件(因此在git目录中它可以替换为分支名称)。所以,只需在条件检查中包装git东西,你就不是用户ID 0(PS1)。

替换导出root声明:

PS1

$(__git_ps1) 

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

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

现在在shell中,你应该能够 PS1='\[\033[32m\]\u@\h\[\033[00m\]:\[\033[34m\]\w\[\033[31m\]$(if [ $(id -u) -ne 0 ]; then echo $(__git_ps1) ; fi)\[\033[00m\]\$ ' 没有错误信息。

答案 4 :(得分:0)

如果您不想添加-l之类的额外标记(或者不想使用su等等),您也可以将root的bashrc更改为不使用__git_ps1

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

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

基本上,只需复制PS1中的~/.bashrc或类似/root/.bashrc的{​​{1}},并删除对__git_ps1的任何引用。

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

答案 5 :(得分:-1)

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

(__git_ps1)

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

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