ZSH自动完成git命令需要很长时间,我能关闭或优化它吗?

29

Git的标签自动完成对于小型项目非常有用,但我目前正在处理两个使用git的大型项目,在这些项目中,它比没有用还糟糕。例如,每当我输入git add forms<tab>时,git需要20秒或更长时间才能找到该文件(在这个例子中是forms.py),在此期间我不能在终端做任何其他事情。有没有办法关闭自动完成功能,或者使其更快?


你使用的是哪个shell - johnsyweb
我正在使用zsh,我想使用zsh的标准文件名自动补全而不是git的。 - haroba
顺便提一下,set -x就足够展示/证明哪个自动完成需要太长时间了。 - MarcH
@Johnsyweb:git-completion.bash 的第一行是:为 Git 核心提供 bash/zsh 自动补全支持 - MarcH
6个回答

56

这不是git自动完成文件名的问题,而是你的shell的问题。当你输入"cat forms< tab >"时是否也有同样的延迟?

查看此帖子以了解类似问题:

http://talkings.org/post/5236392664/zsh-and-slow-git-completion

此帖子建议在你的.zshrc中添加以下内容:

__git_files () { 
    _wanted files expl 'local files' _files     
}

编辑:这是那个帖子的原始文本

我发现有很多关于大型代码库中git自动补全速度缓慢的投诉帖子。有各种建议的补丁和建议加载最新的zsh。也许其中一些东西会起作用,但我真正想要的是它能够像文件系统中的分支和文件名一样完成名称。我没有找到任何如何获得这种行为的建议,所以我自己想出了解决方法。我认为我应该分享这个方法给任何可能从中受益的人。我只需将以下内容添加到我的.zshrc文件中:

__git_files () { 
    _wanted files expl 'local files' _files  }

现在我可以运行git命令,并且获得接近即时的完成,同时还能获得类似于ls提供的文件完成。


谢谢,这个方法可行!我在想是否应该提交一个 git 或 zsh 的 bug 报告,因为这个解决方案非常不直观。 - haroba
1
你的解决方案非常好用,但链接已经失效了。能否请您解释一下这个代码是做什么的?谢谢。 - Mariano
1
对于那些询问的人,似乎 __git_files 是用于自动完成 git 的函数,而这个新函数扫描文件系统而不是与 git 通信。 - WouterH
3
对我来说似乎没有影响(需要注意我的存储库包含许多未跟踪、被忽略的文件,并且我正在使用Cygwin的ZSH)。很明显在我的电脑上有所不同。你有什么建议可以诊断这种差异吗? - Sridhar Sarnobat
请确保将此命令放在您的 zsh 插件 之前,否则您可能会在尝试实际运行 Git 命令时出现快速自动完成但错误的情况。 - Simon
显示剩余2条评论

12

7

我对zshell没有任何经验,但是我在另一个论坛上找到了这个答案。你需要在你的.zshrc文件中包含以下这一行:

compdef -d git

3
不幸的是,这会导致Git命令无法正常完成。例如,如果您键入“git ch<TAB>”,它将不会给出有效的Git命令列表。 - amcnabb
使用许多git命令时,第一个参数可以是分支或文件名。有时您想要完成文件名(这应该始终非常快),然后就不得不等待浏览所有您不关心的分支很长时间。禁用git自动完成可以解决这个频繁的问题。 - MarcH
1
是的,这将关闭自动完成,这正是OP所要求的。 - FelipeC
太好了,我找到了这个答案。在任何有大型LFS文件的repo中按下<Tab>键都会使zsh冻结。现在,在像“git diff filename”这样的命令中完成文件名的自动补全瞬间完成,因为它只是进行文件匹配。 - user3243135

4
这是因为Zsh默认带有Git的完整补全功能,导致过于臃肿。我写了一篇博客文章来解释如何解决这个问题,但它必须在Zsh项目之外进行。
简单的答案是安装Git的zsh补全,这与Zsh的git补全(默认情况下)不同。下载git-completion.zsh,并将其放置在~/.zsh/_git中。然后将其放置在您的fpath中。
fpath=(~/.zsh $fpath)

现在你应该会飞了。

正如这里的另一个评论所解释的那样;另一个选择是使用oh-my-sh并启用gitfast插件,它可以达到同样的效果。

Zsh开发人员为什么要坚持使他们的代码变慢呢?我不知道,但在这里你可以看到他们推理的一个示例:关于git完成速度问题的回复


我使用了gitfast插件和antidote,看起来已经启用了。 但是如果我不把mv /usr/share/zsh/5.9/functions/Completion/Unix/_git /usr/share/zsh/5.9/functions/Completion/Unix/_bugit移开,git checkout feature/<TAB>仍然慢得要命...有什么解决办法吗? - undefined

-1
一个非常快速而不太优雅的解决方案是删除负责自动完成的以下文件。
/usr/local/git/contrib/completion/git-completion.bash

1
我不能这样做,因为我不是这个服务器上唯一的用户,其他人可能会或可能不想使用git自动补全。如果我没有误解什么的话,当git项目变得庞大时,它似乎很奇怪没有一个简单的解决方案。 - haroba
2
@Aqwis:不要在你的shell启动脚本中调用那个文件。 - mipadi
2
它没有在我的shell启动脚本中被引用。 - haroba
1
除此之外并不重要:这是针对Bash的,他的问题出在Zsh上。默认情况下,Zsh会加载其臃肿的自动补全内容。 - FelipeC

-4

1
但这是针对Zsh的,不是Bash。 - FelipeC
@FelipeC,你自己的博客解释了在zsh中使用git-completion.bash是可能的(并不是说“推荐”)。 - MarcH
是的,但你没有解释如何做。 - FelipeC
你评论并投票反对,甚至没有指出自己的解释。奇怪。 - MarcH
当您在zsh中引用该文件时,会发生以下情况:“警告:此脚本已弃用,请参阅git-completion.zsh”。我写下这个警告是有原因的,Git开发人员也同意;您需要使用新方法。是的,您仍然可以这样做,但不建议这样做,它已经被弃用多年了,我们应该考虑将其删除。 - FelipeC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接