Bash别名中的Git自动完成功能?


82

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

有没有一种方法可以指示Bash为另一个命令“继承”自动完成的“驱动程序”?




相关:如果别名设置了自定义,git-dir则使用this
user202729 '19

Answers:


46

如果可以找到原始命令使用的完成功能,则可以使用将其分配给别名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 

1
在ubuntu 12.04上,
补全

8
如果complete -F不为你工作,看到答案__git_complete下面stackoverflow.com/a/24665529/3779
史蒂夫粘土

97

使用后complete -F

complete -F _git_checkout go

跳完后go可能会导致:

bash: [: 1: unary operator expected

代替complete使用__git_complete

这是git bash补全的内置功能。

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

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

3
@LưuVĩnhPhúc我遇到了同样的问题。这是因为我的__git_completebash-completion程序包中有此功能(使用brew install bash-completion,通过homebrew安装),该功能当前未包含在我的bash配置文件中。必须将此行添加到〜/ .bash_profile:[ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion
jangosteve

git checkout别名下添加__git_complete就像魅力一样!
Rajaraman

应该是__git_main,不是_git_git存在的原因仅是为了向后兼容,它基本上是__git_main包装好的。
FelipeC

18

在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

1
需要手动加载的原因是当前Bash动态加载那些文件。到目前为止,它已根据其名称加载它们。直到您完成Git完成后,该文件才会被加载,这.bashrc在读取时已经太迟了。
富兰克林·于

17

在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>

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


我只想添加一个ssh / terminal会话,将所有内容放在.bashrc中。我在.bash_profile中有git完整的东西,而在.bashrc中有别名,无法使其正常工作。直到我加了一个echo "profile"/ echo "rc",我才算出那个。
mtonc

2

要添加其他出色的答案:通常,您有很多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


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


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

1

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

alias g="git"
__git_complete g __git_main

alias g="gl"
__git_complete gl _git_log

但是您不应该使用_gitmain命令,它是__git_main

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


0

我意识到您是在专门询问bash别名,但是对于那些来这里寻找复杂git别名的bash自动完成功能的人,请参见此处

尤其是:

# 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 ; ... '".
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.