【问题标题】:__git_ps1 extremely slow in kernel tree__git_ps1 在内核树中非常慢
【发布时间】:2011-05-10 16:07:59
【问题描述】:
$ time __git_ps1
((v2.6.33.4))
real    0m1.467s
user    0m0.864s
sys  0m0.564s

这使我的提示无法使用;但另一方面,它太有用了,不能轻易放弃。知道为什么它运行如此缓慢以及我能做些什么吗?

设置详情:

$ uname -a
Linux martin-laptop 2.6.35-22-generic #35-Ubuntu SMP Sat Oct 16 20:36:48 UTC 2010 i686 GNU/Linux

$ git --version
git version 1.7.1

$ du -sh .
876M    .

我怀疑我的机器有问题,因为在我同事的机器上,在我克隆的内核树中,相同的命令立即返回

$ time __git_ps1
((v2.6.33.4))
real    0m0.039s
user    0m0.008s
sys 0m0.016s

添加 hdparm 输出:

我的

$ sudo hdparm -tT /dev/sda4

/dev/sda4:
 Timing cached reads:   1542 MB in  2.00 seconds = 772.35 MB/sec
 Timing buffered disk reads:  110 MB in  3.02 seconds =  36.42 MB/sec

同事的

$ sudo hdparm -Tt /dev/sda6

/dev/sda6:
 Timing cached reads:   1850 MB in  2.00 seconds = 926.03 MB/sec
 Timing buffered disk reads:  210 MB in  3.02 seconds =  69.53 MB/sec

其他区别:同事运行的是 git 1.6.5,我运行的是 1.7.1

【问题讨论】:

  • 您运行的是什么操作系统?您的存储库有多大?
  • 好点,我已经在帖子中添加了设置详细信息
  • 是第一次很慢,还是随后分别调用__git_ps1 git status 也很慢?可能是缓存问题。 (在我的电脑上,第一次通话真的很慢,之后很快)
  • 您能否提供来自您和同事 PC 的 hdparm -tT 的详细信息?如果它们相等,您可以尝试使用 top (或任何其他活动监视器)来查看是否没有进程会破坏您的机器性能?
  • mpapis:添加 hdparm 输出,没有显着差异。 top 显示 cpu 空闲在 10%

标签: git bash


【解决方案1】:

你能试试我的git PS1 版本是更快还是同样慢?

【讨论】:

  • 它甚至更慢。在这一点上,我一般怀疑 git 有什么问题,因为 git status 也比它应该花费的时间更长
【解决方案2】:

如何将 git-completion.bash 更新到最新版本 http://git.kernel.org/?p=git/git.git;a=tree;f=contrib/completion;h=525eddf7e4c03acc7b3f01f09f45515cf63cd9b4;hb=master

问题是这个内核 repo 的本地问题还是一般问题?

git fsck --full 是否透露了什么信息?

【讨论】:

  • 最新的 git-completion.bash 没有帮助。它似乎也是内核本地的,但我没有其他类似大小的东西可以测试它。当我离开时, git fsck --full 会继续运行,看看它是否在早上出现了任何东西,尽管我认为 repo 很好,因为它是我同事盒子上工作 repo 的克隆。
  • 和 git fsck --full 也没有发现任何问题。
  • 从 kernel.org 克隆一个内核 repo,看看那里是否也存在问题。如果那个没问题,你的旧回购可能以某种奇怪的方式被破坏。另一种方法是在 git status 上使用“strace”来查看发生了什么。可能与大学机器上的 strace 输出存在差异。
  • 也发生在新的内核克隆中。 strace 是个好主意,会试一试。在这一点上,我开始怀疑我只是有一个糟糕的硬盘。
【解决方案3】:

repo 有子模块吗?由于 1.7.0 中引入的更改,请参阅 this post 中有关“git status 现在非常慢”(带有子模块)的备注:

修复/解决方法是将“--ignore-submodules”传递给“git status”,如以下更新部分所述:“更新:感谢 VonC,他在 git 下面的 cmets 中指出1.7.2 现在有一个 git status 的“–ignore-submodules”选项,它可以恢复旧的行为,还提供了有用的选项,即只有更改的文件(不是未跟踪的文件)导致子模块显示为脏。"

【讨论】:

  • 完整的内核树肯定有子模块。
  • 升级到 1.7.3 并尝试了 --ignore-submodules,但没有帮助。立即尝试 1.6.6。
【解决方案4】:

原来是两件事的结合:

我正在使用

export GIT_PS1_SHOWDIRTYSTATE=true
export GIT_PS1_SHOWUNTRACKEDFILES=true

默认情况下。事实证明,这在内核大小的树上是不可用的。删除这些选项会从 __git_ps1 中删除一些不错的功能,但至少现在它会立即返回。 (有用的一课 - 先尝试新创建的用户帐户中的内容。)

另外,我的工作机器上的硬盘很慢,所以这本身不是 git 问题;这只是它第一次在我注意到的情况下真正突兀。

【讨论】:

  • 您可以使用git config --global bash.showDirtyState true 并仅使用git config bash.showDirtyState false 为内核树覆盖它。对于未跟踪的文件(在 git 1.7.3.2 上)没有这样的设置,但它也应该很容易实现
  • +1:即使在使用相当小的存储库时,这也是我的命令提示符迟缓的原因。
【解决方案5】:

要知道这需要时间你可以在哪里做:

bash -x

然后

__git_ps1

我的需要时间

++ git ls-files --others --exclude-standard

它列出了我的 gitted home 目录的所有文件。 即使在快速的ssd上,也需要很长时间。

要获得完整的日志,您可以从 shell 中进行

zsh -x 2> zshdebug.log

然后你退出那个子shell,调试信息在zshdebug.log文件中

【讨论】:

  • 不错的提示,谢谢!原来同样的事情对我来说也需要时间。
【解决方案6】:

要解决这个问题,只需将其添加到您的 .bashrc 中

export GIT_PS1_SHOWDIRTYSTATE=
export GIT_PS1_SHOWUNTRACKEDFILES=

将禁用某些文件查找。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2012-11-27
    • 2015-05-22
    • 1970-01-01
    相关资源
    最近更新 更多