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

Man*_*ter 38 windows git

我正在开发一个相当大的git repo,有几千个(远程)分支.我习惯在控制台中使用自动完成(使用[TAB])(在这种情况下使用Git Bash),所以我也无意识地为git命令执行此操作.

比如我打字

git checkout task[TAB]
Run Code Online (Sandbox Code Playgroud)

因为控制台经常停顿几分钟.有没有办法只限制自动完成到本地分支?

eri*_*ers 26

我假设你正在使用git-completion.bash脚本,而你关心它git checkout.

为了实现这一点,我只更改了_git_checkout ()函数定义中的一行git-completion.bash:

<       __gitcomp_nl "$(__git_refs '' $track)"
---
>       __gitcomp_nl "$(__git_heads '' $track)"
Run Code Online (Sandbox Code Playgroud)

我的理解是,这只会影响制表符完成操作(因为它在*switch-case语句的位置内).

  • 我实际上添加了一个新方法:__ git_rco().rco(或远程签出)使用`refs`的旧行为.__git_checkout()现在只是`head`.我有一个别名rco = checkout.这样,如果需要,您仍然可以获得旧的行为. (3认同)
  • 步骤:`sudoedit/usr/share/bash-completion/completions/git`,然后更改@ erik.weathers答案中提到的行,重新打开bash和voilà!非常感谢. (2认同)

Von*_*onC 20

使用Git 2.13(2017年第二季度),您可以禁用(部分)分支完成.

git checkout --no-guess ...
# or:
export GIT_COMPLETION_CHECKOUT_NO_GUESS=1
Run Code Online (Sandbox Code Playgroud)

请参阅Jeff King()提交的60e71bb(2017年4月21日).(由Junio C Hamano合并- -提交b439747,2017年5月1日)peff
gitster

contrib/completion/git-completion.bash现在所述:

您可以设置以下环境变量以影响完成例程的行为:

GIT_COMPLETION_CHECKOUT_NO_GUESS
Run Code Online (Sandbox Code Playgroud)

设置为"1"时,不要在git-checkout 完成时包含"DWIM"建议(例如,当"origin/foo"存在时完成"foo").

注意:DWIM是D o W hat I M ean的缩写,系统试图预测用户打算做什么,自动纠正琐碎错误,而不是盲目地执行用户明确但可能不正确的输入.

completion:可选择禁用结帐DWIM

当我们完成" git checkout"的分支名称时,我们还会完成可能触发DWIM行为的远程分支名称.根据您的工作流程和项目,这可能既方便又烦人.

例如,我的克隆gitster.git包含74个本地" jk/*"分支,但原点包含另一个147.
当我想签出本地分支但不能完全记住名称时,选项卡完成显示251个条目.更糟糕的是,对于已经为pu获取的主题,上游分支名称可能与我的相似,导致我选择错误的并且意外地创建新分支的概率很高.


注意:"拾起pu":看看是什么烹饪git.git:它开始于:

前缀为' -'的提交仅在' pu'(建议的更新)中,而以' +'为前缀的提交在' next'中.

这是Git Workflow Graduation流程的一部分.

pu (建议更新)是一个集成分支,用于尚未准备好包含的内容


此修补程序为用户添加了一种方法,可以告知完成代码不包含用于结帐的DWIM建议.
这可以通过输入以下内容来完成:

git checkout --no-guess jk/<TAB>
Run Code Online (Sandbox Code Playgroud)

但那很麻烦.

不利的一面,当然,是你不再得到完成支持,当你想要调用DWIM行为.
但是根据你的工作流程,这可能不是一个很大的损失(例如,在git.git我更可能想要分离,所以我打算" git checkout origin/jk/<TAB>"无论如何).

  • 遗憾的是,创建在内部使用此选项的别名似乎不起作用。仅直接在 CLI 上提供选项只会导致本地分支完成。:( (2认同)

seh*_*ehe 10

你可以破解/etc/bash_completion.d/git

你需要编辑 __git_refs ()

请注意,行为的更改将适用于所有位置(即使使用git push/pull,您也可能不希望这样做).当然,您可以复制该函数或传递一个额外的参数,但我会留给您

  • 是的,事实证明标签*和*远程分支很慢.我更改了`refs ="refs/tags refs/heads refs/remotes"`to only`refs ="refs/heads"`并注释掉了整个"试着找到一个匹配完成词的远程分支"部分.不漂亮,但WFM :-) (5认同)

Tol*_*Hon 9

如果您通过自制程序安装了git-completion,它位于: /usr/local/etc/bash_completion.d/git-completion.bash

按照上面的erik.weathers的回答,我做了以下更改,因此自动完成功能可以根据当前前缀为本地和远程工作.默认情况下,它只会搜索本地,但如果我指定origin/…它,我知道我也想搜索远程分支.

_git_checkout ()方法中,改变

    __gitcomp_nl "$(__git_refs '' $track)"
Run Code Online (Sandbox Code Playgroud)

至:

    # 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
Run Code Online (Sandbox Code Playgroud)

当然,您可以更改origin为其他内容,或者如果您有多个远程前缀,则可以通过远程前缀列表进行搜索.