在Git Bash中禁用远程分支的自动完成?

我正在与一个相当大的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/中提到的相同,您应该能够用一个普通&#x7684;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或类似的),并得到你想要的。