我正在与一个相当大的git回购数千(远程)分支。 我习惯于在控制台(在这种情况下是Git Bash)使用自动完成(使用[TAB]),所以我也不自觉地为git命令做了这些。
比如我打字
git checkout task[TAB]
其效果是控制台经常停顿几分钟。 有没有办法限制自动完成到本地分行?
使用Git 2.13(2017年第2季度),您可以禁用(部分)分支完成。
git checkout --no-guess ... # or: export GIT_COMPLETION_CHECKOUT_NO_GUESS=1
见Jeff King( peff
)的 提交60e71bb (2017年4月21日) 。
(由Junio C gitster
合并- gitster
– 提交b439747 ,2017年5月1日)
如现在在contrib/completion/git-completion.bash
:
您可以设置以下环境变量来影响完成例程的行为:
GIT_COMPLETION_CHECKOUT_NO_GUESS
当设置为“1”时,不要在
git-checkout
完成中包含“DWIM”建议(例如,当“origin / foo”存在时完成“foo”)。
注意: DWIM是我自己的简称,系统试图预测用户打算做什么,自动纠正微不足道的错误,而不是盲目地执行用户明确但可能不正确的输入。
completion
:可选择禁用检出DWIM当我们完成“
git checkout
”的分支名称时,我们还完成了可能触发DWIM行为的远程分支名称。 根据您的工作流程和项目,这可能是方便或烦人的。例如,我的克隆
gitster.git
包含74个本地“jk/*
”分支,但原点包含另一个147。
当我想结帐本地分行,但不能完全记住名字,标签填写显示我251条目。 更糟糕的是,对于一个已经被pu拾取的话题,上游分支名称很可能与我的相似,导致我选错的概率很高,并且意外地创建了一个新的分支。
注意:“pick up for pu”:请参阅git.git
的烹饪git.git
: 以git.git
内容开头:
前缀为'
-
'的提交仅在'pu
'(提议的更新)中,而提交前缀为'+
'的提交在'next
'中。
这是Git工作流程毕业过程的一部分 。
pu
(提议的更新)是一个集成分支的东西,还没有完全准备纳入
此修补程序为用户提供了一种方法,告诉完成代码不要包含用于结帐的DWIM建议。
这可以通过键入以下命令来完成:git checkout --no-guess jk/<TAB>
但是这相当麻烦。
不利的一面是,当你想要调用DWIM行为时,你不再得到完成支持。
但是,根据你的工作流程,这可能不是一个大的损失(例如,在git.git我更想要分离,所以我会输入“git checkout origin/jk/<TAB>
”)。
我假设你正在使用git-completion.bash
脚本,而你只关心git checkout
。
为了做到这一点,我只是在git-completion.bash
中的_git_checkout ()
函数的定义中改了一行:
< __gitcomp_nl "$(__git_refs '' $track)" --- > __gitcomp_nl "$(__git_heads '' $track)"
我的理解是,这只影响到制表符完成操作(因为它位于switch-case语句的case中)。
你可以破解/etc/bash_completion.d/git
你需要编辑__git_refs ()
请注意,行为的变化将适用于每一个地方(甚至在你可能不想要的git push / pull的情况下)。 你当然可以做一个函数的副本或传递一个额外的参数,但我把这个给你
如果你通过homebrew安装了git-completion,它位于: /usr/local/etc/bash_completion.d/git-completion.bash
根据上面的erik.weathers的回答 ,我做了以下更改,以便自动完成可以基于当前前缀为本地和远程工作。 默认情况下,它只会搜索本地,但如果我指定的origin/…
它会知道我也想搜索远程分支。
在_git_checkout ()
方法中,更改
__gitcomp_nl "$(__git_refs '' $track)"
至:
# only search local branches instead of remote branches if origin isn't specified if [[ $cur == "origin/"* ]]; then __gitcomp_nl "$(__git_refs '' $track)" else __gitcomp_nl "$(__git_heads '' $track)" fi
当然,你可以改变origin
的东西,或者你可以让它通过远程前缀列表搜索,如果你有超过1。
你可以认为你只是与别名co
的本地分支和所有的分支完整的命令checkout
。
您可以执行以下操作。 在你的.bashrc中,你重新定义了_git_checkout()
函数。 你让这个函数不变,除了结束:
if [ $command -eq "co" ]; then __gitcomp "$(__git_refs_local '' $track)" else __gitcomp "$(__git_refs '' $track)" fi
然后,你只需要定义一个新的函数__git_refs_local
,在那里你删除远程的东西。
修改$(brew --prefix)/etc/bash_completion.d/git-completion.bash
不是一个好主意,因为每次通过Homebrew更新Git时都会覆盖它。
结合所有的答案,在完成文件的源文件后,我只覆盖我的.bash_profile
文件中的完成文件的_git_checkout
函数:
_git_checkout () { __git_has_doubledash && return case "$cur" in --conflict=*) __gitcomp "diff3 merge" "" "${cur##--conflict=}" ;; --*) __gitcomp " --quiet --ours --theirs --track --no-track --merge --conflict= --orphan --patch " ;; *) # check if --track, --no-track, or --no-guess was specified # if so, disable DWIM mode local flags="--track --no-track --no-guess" track=1 if [ -n "$(__git_find_on_cmdline "$flags")" ]; then track='' fi # only search local branches instead of remote branches if origin isn't # specified if [[ $cur == "origin/"* ]]; then __gitcomp_nl "$(__git_refs '' $track)" else __gitcomp_nl "$(__git_heads '' $track)" fi ;; esac }
我自己并没有使用Git Bash,但如果这与http://tekrat.com/2008/04/30/bash-autocompletion-git-super-lazy-goodness/中提到的相同,您应该能够用一个普通的git分支替换git 分支
_complete_git() { if [ -d .git ]; then branches=`git branch -a | cut -c 3-` tags=`git tag` cur="${COMP_WORDS[COMP_CWORD]}" COMPREPLY=( $(compgen -W "${branches} ${tags}" -- ${cur}) ) fi } complete -F _complete_git git checkout
(在你的.profile或类似的),并得到你想要的。