在Windows 7 x64上,Git Bash自动补全功能缓慢。

14

我有两台机器,在这些机器上,git bash的自动补全非常慢。当我按下tab键时,通常需要8到10秒才能完成文件名的补全。这似乎仅发生在自动补全是 git 命令的一部分时。 cd 的自动补全正常工作。实际执行git命令运行良好。

我正在使用 git版本1.8.3-preview20130601

$ git count-objects -vH
count: 9
size: 10.23 KiB
in-pack: 2488
packs: 1
size-pack: 18.68 MiB
prune-packable: 0
garbage: 0
size-garbage: 0 bytes

可能是什么原因导致这种情况发生?有没有可能的解决方案?

编辑:我已经更新到 Git(版本1.8.4-preview20130916),问题仍然存在。我注意到,在 ConEmu 中运行 bash shell 时,在长时间暂停期间在底部显示的命令是 uniq.exe。似乎对该可执行文件的调用是消耗时间的原因。

编辑:升级到 git版本1.9.0.msysgit.0 已经大大缓解了问题。现在的延迟只有1到2秒钟。其他命令如 cd 几乎是瞬间完成的(小于0.5秒)。我也再也没有看到 uniq.exe 运行了,只有 sh.exe


你的代码库有多大? - Anshul Goyal
不是很多,有46个提交。du -sh .git显示19M。 - TwistedTech
如果你正在使用Visual Studio,你尝试过关闭解决方案吗?当我开始遇到缓慢的情况时,这似乎对我有用,而且我几乎拥有你描述的相同设置。 - carmbrester
4个回答

5

Git 2.13(2017年第二季度)应该会改善Git bash自动完成,因为对于大量引用的引用完成已经加快了速度,部分原因是通过放弃消除歧义的引用和消除“git for-each-ref”与“ls-remote”之间的大多数shell处理以及Bash的完成功能。

请参考以下链接:commit 227307acommit 745d655commit fef56ebcommit 400a755commit 824388dcommit e8cb023commit e896369commit b2b6811commit 3ad8ea7commit aed3881commit aa0644fcommit 2ea328acommit 15b4a16(于2017年3月23日)以及commit c977eef(于2017年2月3日),均由SZEDER Gábor (szeder)提交。
(由Junio C Hamano -- gitster --于2017年3月30日在commit bf65060中合并)

例如:

completion:加快分支和标签的自动补全速度

修改__git_heads()__git_tags()以及它们的一些调用点,这样我们就可以让'git for-each-ref'来完成所有繁重的工作,这些函数的输出在交给Bash之前不需要任何进一步的处理或过滤,从而加快了分支和标签自动补全的速度。这些都是加快引用自动补全速度的相同技巧,即:

  • 扩展两个函数以接受前缀、当前单词和后缀位置参数,所有参数都是可选的,默认情况下都为空,以保持无参数行为不变。

  • 指定适当的通配符模式给'git for-each-ref', 以列出与给定当前单词参数匹配的分支或标记。

  • 修改'git for-each-ref --format=<...>'以包括给定的前缀和后缀。

  • 调整所有调用点以指定适当的前缀、当前单词和后缀参数,并使用__gitcomp_direct()填充COMPREPLY


注意:Git 2.18(2018年第二季度)的文件名自动补全性能有所提高,请参见“Git bash-completion with filename support?”。


我在Windows 7上发现自动完成非常缓慢,但在安装Git 2.13之后,情况确实好了很多。(分支名称的自动完成时间从30秒减少到了几秒钟。) - starwed

5

我使用版本1.9.5时,仅在git命令中遇到了自动完成速度慢的问题。在根目录下,自动完成可能需要8秒钟,但在较少文件的较低级别下,速度会更快。

我最终通过在此处找到的信息解决了这个问题:https://github.com/msysgit/msysgit/wiki/Diagnosing-why-Git-is-so-slow

通过为我的存储库设置 git config core.fscache true,许多命令(例如adddiff)的自动完成运行速度更快,但并非所有命令(例如rm)。希望这能有所帮助。


在Windows 7上使用git 2.7处理大型(.git/为1.3G)代码库时,这将带来显著的改进。 - piedar
虽然这可能对Windows有所帮助,但git-completion.bash在Linux上也非常慢:https://dev59.com/PGkw5IYBdhLWcg3wkLQX - MarcH

4
这是ConEmu稳定版本已知的问题。
ConEmu页面中得知:

免责声明 #2

如果你在执行批处理或命令(来自cmd/git/bash等)时发现有延迟,请升级到最新的alpha版本或取消选中选项“注入ConEmuHk”。阅读问题526以了解详情。


当我问这个问题时,我还没有使用 ConEmu。后来我发现了它并注意到exe文件名,所以决定将其包括在内。 - TwistedTech

0
对我来说,这个问题可以通过修剪源删除已合并的分支来解决。这两个操作都是一些 Git 的日常维护工作,应该定期进行。
git remote update origin --prune

以下是命令的解释:获取所有已合并到 origin/master 的远程分支 | 黑名单 | 白名单 | 如果适用,删除远程/origin 前缀 | 删除所有远程/本地分支。
警告:此操作将删除远程分支,请谨慎使用。
git branch -a --merged origin/master | grep -v 'release' | grep 'remotes/origin/' | sed -e 's/remotes\/origin\///g' | xargs -t -n1 git push -d origin 

警告:这将删除本地分支。

git branch --merged origin/master | grep -v 'release' | grep 'feature' | xargs -t -n1 git branch -d

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