Git的别名 - 分支名称的命令行自动完成(Git aliases - command line a

2019-07-30 09:34发布

如果我运行一个普通的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

Answer 1:

对于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"对自动完成功能使用决定。 使用更复杂的外壳命令作为别名目标将理解箔这种方法。

寻找进一步,似乎对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()



Answer 2:

更新2015年7月(GIT 2.5):获取git的别名是比较容易contrib/completion/git-completion.bash

见提交12bdc88 , 提交e8f9e42 (2015年5月10日)由SZEDER的Gabor( szeder ) 。
(通过合并JUNIOÇ滨野- gitster -在提交935d937 ,22 2015年5月)

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

Git的完成应在Git的2.1(2014年8月)复杂的别名更好地工作。
见提交56f24e8由斯特芬PROHASKA( sprohaska

完成:手柄' !f() { ... }; f !f() { ... }; f “和“ !sh -c '...' -别名

' !f() { ... }; f !f() { ... }; f “和“ !sh -c '....' -建议模式来声明更复杂的别名(见git的维基 )。
这犯教完成来处理它们。

当确定要使用的别名,其完成后,开口支架或单引号现在跳过,并且对于一个git命令搜索继续进行。
例如,别名' !f() { git commit ... } '或“ !sh -c 'git commit ...'现在触发提交完成。
此前,在搜索上的开括号或停止报价,并完成试了一下,以确定如何完成的,这显然是无用的。

null命令“ : ”现在被跳过,因此它可以作为一种变通方法来声明完成期望的风格。

例如,别名:

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

现在触发提交完成。

壳牌函数声明现在有或没有空间的括号,即“前的工作!f() ... ”和“ !f () ... ”都工作。



文章来源: Git aliases - command line autocompletion of branch names