在bash别名中Git自动完成?

时间:2012-03-26 08:59:22

标签: git bash

我正在使用go作为git checkout branchname的简单bash别名。我想念的是自动完成功能,它与完整的git checkout branchna...命令一起使用,但不在别名中。

有没有办法指示Bash为其他命令“继承”自动完成“驱动程序”?

10 个答案:

答案 0 :(得分:66)

使用complete -F后:

complete -F _git_checkout go

go后的标签可能会导致:

bash: [: 1: unary operator expected

而不是complete,请使用__git_complete

这是git bash completion的内置函数。

声明别名后,将正确的自动完成功能绑定到它:

alias g="git"
__git_complete g _git

alias go="git checkout"
__git_complete go _git_checkout

alias gp="git push"
__git_complete gp _git_push

答案 1 :(得分:37)

如果您可以找到原始命令使用的完成功能,则可以使用complete -F将其指定给别名。

例如,在我的ubuntu框中,git checkout使用的完成功能为_git_checkout(在/etc/bash_complete.d/git中找到)。

实施例

在运行complete -F之前:

[me@home]$ git checkout <TAB><TAB>
HEAD            master          origin/HEAD     origin/master

[me@home]$ alias go="git checkout"

[me@home]$$ go <TAB><TAB>
.git/                precommit_config.py  README.md            SvnSentinel/         
.gitignore           precommit.py         startcommit.py       tests/ 

后:

[me@home]$$ complete -F _git_checkout go

[me@home]$$ go <TAB><TAB>
HEAD            master          origin/HEAD     origin/master 

答案 2 :(得分:8)

在Ubuntu 16.04.3 LTS中,我需要提供的文件是/usr/share/bash-completion/completions/git。所以在.bash_custom(或.bashrc,无论如何):

[ -f /usr/share/bash-completion/completions/git ] && . /usr/share/bash-completion/completions/git
__git_complete g __git_main

(这个答案属于对程序员的回复jangosteve但由于我需要50个代表来创建评论,我会将其作为自己的答案进行垃圾邮件。)

答案 3 :(得分:6)

在Ubuntu 18.04(Bionic)上,以下工作正常。将这样的代码片段(带有别名)添加到您首选的bash配置文件中,例如.bashrc.bash_aliases .bash_profile

# define aliases
alias gc='git checkout'
alias gp='git pull'

# setup autocompletion
if [ -f "/usr/share/bash-completion/completions/git" ]; then
  source /usr/share/bash-completion/completions/git
  __git_complete gc _git_checkout
  __git_complete gp _git_pull
else
  echo "Error loading git completions"
fi

通常__git_complete指令的格式如下:

__git_complete <YOUR ALIAS> _git_<GIT COMMAND NAME>

这将现有答案中的智慧整合到一个最新的答案中,谢谢大家。

答案 4 :(得分:1)

在Linux Mint上,这对我不起作用。我得到了bash: [: 1: unary operator expected

我发现以下响应运行良好 - 用户提供的故障排除部分非常有帮助。 https://superuser.com/questions/436314/how-can-i-get-bash-to-perform-tab-completion-for-my-aliases

答案 5 :(得分:1)

对于macOS,运行以下命令以安装bash补全

 brew install bash-completion

然后添加以下内容

[[ -r "/usr/local/etc/profile.d/bash_completion.sh" ]] && . "/usr/local/etc/profile.d/bash_completion.sh" 

到您的.bashrc或.bash_profile

答案 6 :(得分:1)

在Ubuntu 20.04上,我将其添加到~/.bashrc

source /usr/share/bash-completion/completions/git
alias g='git'
__git_complete g _git
alias go='git checkout'
__git_complete go _git_checkout

答案 7 :(得分:1)

正如其他人回答的那样,您应该使用__git_complete,否则脚本将失败。

alias g="git"
__git_complete g __git_main

alias g="gl"
__git_complete gl _git_log

但是您不应使用_git作为主要命令,它是__git_main

不幸的是,许多关于完成的信息被隐藏了,但是您可以在我的fork的自述文件中找到更多信息:git-completion

答案 8 :(得分:0)

要添加到其他出色的答案中:通常,您有很多Git别名,并且手动转发所有别名的补全可能很繁琐。这是自动执行此操作的一个小技巧:

if [ -f "/usr/share/bash-completion/completions/git" ]; then
  # Enable Git completions for aliases
  . /usr/share/bash-completion/completions/git
  for a in $(alias | sed -n 's/^alias \(g[^=]*\)=.git .*/\1/p'); do
    c=$(alias $a | sed 's/^[^=]*=.git \([a-z0-9\-]\+\).*/\1/' | tr '-' '_')
    if set | grep -q "^_git_$c *()"; then
      eval "__git_complete $a _git_$c"
    fi
  done
fi

答案 9 :(得分:0)

我知道您是在专门询问bash别名,但是对于那些来这里寻求在bash中自动完成 以获取复杂git别名的人,请参阅here

尤其是:

# If you use complex aliases of form '!f() { ... }; f', you can use the null
# command ':' as the first command in the function body to declare the desired
# completion style.  For example '!f() { : git commit ; ... }; f' will
# tell the completion to use commit completion.  This also works with aliases
# of form "!sh -c '...'".  For example, "!sh -c ': git commit ; ... '".