如果我运行一个普通的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
对于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()
更新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 () ...
”都工作。