我安装了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源,我也会得到完全相同的行为。
有人知道问题是什么以及如何使其发挥作用?
答案 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,无论如何你可能不需要超级用户。