Git别名 – 命令行自动完成分支名称

如果我运行一个常规的git命令(如git checkout ,当点击tab键时,会获得有用的分支名称自动完成

我有一些以分支名称作为参数的git别名,我想知道是否有办法让分支名称自动完成与他们一起工作?

编辑:

只是从评论的讨论中提供一些澄清,直接映射的别名工作正常,即:

 ci = commit co = checkout 

这是一个更多的参与,并使用$1作为参数不,例如:

 tagarchive = !f() { git tag archive/$1 origin/$1 && git push origin :$1 && git push origin archive/$1 && git branch -d $1; }; f 

Solutions Collecting From Web of "Git别名 – 命令行自动完成分支名称"

对于git别名,git命令( __git() )的自动完成功能使用对git config --get "alias.$1"的调用来确定等效的自动完成功能。 这适用于简单的映射,但会窒息更复杂的别名。

为了解决这个问题,定义一个名字与你的别名匹配的自动完成函数,例如_git_tagarchive() 。 git的自动完成功能应该选择并使用它来自动完成。

例如:

 [me@home]$ git tagarchive <TAB><TAB> AUTHORS gentleSelect/ .gitignore LICENSE test_multiple.html cron/ .git/ index.html README.md [me@home]$ _git_tagarchive() { > _git_branch # reuse that of git branch > } [me@home]$ git tagarchive <TAB><TAB> enable_multiple master origin/gh-pages v0.1 v0.1.3 FETCH_HEAD ORIG_HEAD origin/HEAD v0.1.1 v0.1.3.1 HEAD origin/enable_multiple origin/master v0.1.2 

为了更持久的解决方案,只需将函数定义添加到您的bashrc文件。 例如:

 _git_tagarchive() { _git_branch } 

请注意,我只是重用了git branch的自动完成功能; 你可能希望改变这个更适合的东西或写你自己的。

更多信息

该解决方案是基于对/etc/bash_completion.d/git的探索而确定的。

通常,别名git命令由__git_aliased_commands()函数处理,该函数分析git config --get "alias.$1"以决定使用的自动完成函数。 使用更复杂的shell命令作为别名目标可以理解为这种方法。

进一步看来,通过简单地在_git_前加上_git_ (在命令中用破折号( - )代替下划线),git( _git() )链中的自动完成功能就出现在子命令的自动完成功能中。 这是在检查__git_aliased_command()之前完成的,所以这是我们可以使用的。

 _git () { # ..... local completion_func="_git_${command//-/_}" declare -f $completion_func >/dev/null && $completion_func && return local expansion=$(__git_aliased_command "$command") if [ -n "$expansion" ]; then completion_func="_git_${expansion//-/_}" declare -f $completion_func >/dev/null && $completion_func fi } 

因此,我所做的方法是确保存在与你的别名匹配的函数,即_git_tagarchive()

更新七月2015(Git 2.5):获取git别名在contrib/completion/git-completion.bash更容易。

请参阅SZEDERGábor ( szeder )的 提交12bdc88 , 提交e8f9e42 (2015年5月10日) 。
(由Junio C gitster合并- gitster -在935d937 ,2015年5月22日提交 )

~~~~~~~~~~~~~~

使用Git 2.1中的复杂别名(2014年8月),Git完成应该更好。
见Steffen Prohaska( sprohaska ) 提交56f24e8

完成:处理' !f() { ... }; f !f() { ... }; f '和“ !sh -c '...' - ”别名

' !f() { ... }; f !f() { ... }; f '和“ !sh -c '....' - “是推荐更复杂的别名的模式(参见git wiki )。
这个提交教会了完成处理它们。

当确定要使用别名的完成时,现在跳过了大括号或单引号,并继续搜索git命令。
例如,别名' !f() { git commit ... } '或者“ !sh -c 'git commit ...' ”现在触发提交完成。
以前,搜索停止在左括号或引号,并完成试图确定如何完成,这显然是无用的。

null命令' : '现在被跳过,所以它可以被用作一个解决方法来声明所需的完成样式。

例如,别名:

 !f() { : git commit ; if ... } f !sh -c ': git commit; if ...' - 

现在触发提交完成。

现在shell函数声明现在可以在parens之前使用或不使用空格,即“ !f() ... ”和“ !f () ... ”都可以工作。