分支自动完成功能不适用于推送的git别名

时间:2013-11-26 12:33:20

标签: git bash autocomplete bash-completion

我正在使用Git git-completion并且一切正常但只有一个例外:当我这样做时

git p some_remote [TAB]

我得到当前目录中的文件的自动填充建议(错误)。 p是Git别名:

$ cat ~/.gitconfig
[alias]
    p = push

但是,当我这样做时:

git push some_remote [TAB]

我得到当前存储库中的分支的建议(正确)。在这两种情况下,some_remote的完成都能正常工作。

这是什么原因?

2 个答案:

答案 0 :(得分:4)

这是一个错误!

git-completion.bash 执行 go through your git aliases,将每个连接到正确的完成功能。

但其中四个 - git pushfetchpullremote的功能 - 委托给__git_complete_remote_or_refspec() __git_complete_remote_or_refspec () { local cur_="$cur" cmd="${words[1]}" ... }:

$words

$cmd只是命令行中的令牌列表,只有几行,它开始检查case "$cmd" in fetch) # ... pull|remote) # ... 而不扩展别名,starts like this

git-completion.bash


据我所知,GáborSzeder for example在关于使用shell别名完成工作的主题中。

他在2012年再次提到first reported this two years ago来自 Felipe Contreras (@felipec)。上个月,Felipe in reply to a patch他的announced,实际上有一个自包含的补丁:fork of git

我不知道这是否已在上游提交,但与此同时......如果您想测试一下,请将修补程序应用到curl https://github.com/felipec/git/commit/b7b6be72d60d.diff | patch -d [directory containing git-completion.bash] # useful options for patch: --verbose --dry-run

git-completion.bash

如果您不知道当前declare -F的居住地点,请尝试dirname "$(shopt -s extdebug; declare -F __git_complete | awk '{ print $3 }')"

git-completion.bash

(修补git-completion.zsh后,它会提示您^C的位置以应用第二个大块...您可以点击{{1}}跳过它。)

答案 1 :(得分:3)

2014年4月更新,Git 2.0:

commit 880111c(Felipe Contreras (felipec))现在包括:

完成:修复完成别名“push”,“fetch”等的args

  

某些命令需要第一个单词来确定正在执行的实际操作,但是,当我们使用别名时命令是错误的,例如“alias.p=push”,如果我们尝试完成'{{1 }}',结果会出错,因为__git_complete_remote_or_refspec()不知道它来自何处。

     

因此,我们覆盖git p origin <TAB>,因此别名“words[1]”会被实际命令“p”覆盖。


push似乎与git-completion或常规别名无关。

例如,如果您为“git alias”定义了别名“gp”,就像在“How do I get bash completion to work with aliases?”中一样,您可以输入:

git push

对于git别名可能存在类似的情况,如this script