13

我有两台机器 git bash auto complete 非常慢。当我点击选项卡时,完成文件名可能需要 8 到 10 秒。这似乎只在自动完成是git命令的一部分时发生。自动完成cd工作正常。git 命令的实际执行运行良好。

我在用git version 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 (version 1.8.4-preview20130916)并且问题仍然存在。我确实注意到,在 ConEmu 中运行 bash shell 时,长时间暂停期间底部显示的命令是uniq.exe. 似乎对该可执行文件的调用正在消耗时间。

编辑:更新到git version 1.9.0.msysgit.0已经缓解了很多问题。延迟现在只有 1 到 2 秒。其他类似cd的命令仍然几乎是即时的(< 0.5 秒)。我也看不到uniq.exe跑步了,只是sh.exe

4

4 回答 4

5

Git 2.13(2017 年第二季度)应该改进 Git bash 完成,因为大量引用的 refs 完成速度已经加快,部分是通过放弃消除歧义的引用,部分是通过消除 'git for-each-ref 之间的大部分 shell 处理' 和 'ls-remote' 和 Bash 的完成设施。

参见提交227307A提交745D655提交FEF56EB提交400A755 ,提交824388D,提交E8CB023,提交E896369,提交B2B6811 ,提交3AD8EA7,提交AED3881,commit AED3881 提交AA0644F commit 2EE 2EE 2EE 2EA 15B4A CORME 2EE 2EEN 7.NAMARS MAR MAR)2017 年 2 月),作者SZEDER Gábor ( )(由Junio C Hamano 合并 -- --提交 bf65060中,2017 年 3 月 30 日)szeder
gitster

例如:

completion:加快分支和标记完成

修改__git_heads()and__git_tags()以及它们拥有的少数调用站点,因此我们可以让 ' git for-each-ref' 完成所有艰苦的工作,并且这些函数的输出在移交给 Bash 之前不需要任何进一步的处理或过滤,从而更快地完成分支和标记。这些是之前提交中用于加快 refs 完成的一些相同技巧,即:

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

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

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

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


注意:文件名完成的性能随着 Git 2.18(2018 年第二季度)的提高:请参阅“ Git bash-completion with filename support?

于 2017-04-16T23:17:05.490 回答
4

这是 ConEmu 稳定版的一个已知问题。

ConEmu 页面

免责声明 #2

如果您在执行批处理或命令(来自 cmd/git/bash/etc.)时发现滞后,只需升级到最新的 alpha 版本或取消选中选项“ Inject ConEmuHk ”。阅读问题 526了解详细信息。

于 2014-03-06T15:04:56.677 回答
4

使用 1.9.5 版,我仍然遇到仅 git 命令的慢速自动完成问题。在根级别自动完成可能需要 8 秒,但在较低级别且文件较少时速度更快。

我终于用这里找到的信息解决了这个问题:https ://github.com/msysgit/msysgit/wiki/Diagnosing-why-Git-is-so-slow

通过git config core.fscache true为我的存储库设置,自动完成对于许多命令(例如adddiff,尽管不是全部,例如rm. 我希望这会有所帮助。

于 2015-01-29T22:19:38.937 回答
0

对我来说,这是通过修剪原点删除已经合并的分支来解决的。两者都是一些 git 家务,无论如何都应该每隔一段时间做一次。

git remote update origin --prune

下面的命令解释: 获取合并到 origin/master 的所有远程分支 | 黑名单 | 白名单 | 如果适用,删除远程/源前缀 | 删除所有远程/本地分支。

警告:这将删除远程分支,谨慎使用。

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
于 2021-12-28T14:36:02.560 回答