我正在使用Git git-completion并且一切正常但只有一个例外:当我这样做时
git p some_remote [TAB]
我得到当前目录中的文件的自动填充建议(错误)。 p
是Git别名:
$ cat ~/.gitconfig
[alias]
p = push
但是,当我这样做时:
git push some_remote [TAB]
我得到当前存储库中的分支的建议(正确)。在这两种情况下,some_remote
的完成都能正常工作。
这是什么原因?
答案 0 :(得分:4)
这是一个错误!
git-completion.bash
执行 go through your git aliases,将每个连接到正确的完成功能。
但其中四个 - git push
,fetch
,pull
和remote
的功能 - 委托给__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
))现在包括:
某些命令需要第一个单词来确定正在执行的实际操作,但是,当我们使用别名时命令是错误的,例如“
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。