【问题标题】:Git Status Takes a Long Time to CompleteGit 状态需要很长时间才能完成
【发布时间】:2009-07-26 04:59:42
【问题描述】:

我正在使用git 来管理 Windows 机器上本地目录中的文件 - 这里不涉及网络,我没有向/从另一台机器推送或拉取。我的目录中可能有 100 个文件,所有测试文件都非常小。当我运行git status 时,通常需要 20-30 秒才能完成。这是正常的吗?有什么办法可以加快速度,或者有什么更好的方法来查看我的存储库的状态(更改的文件、未跟踪的文件等)?其他git 命令似乎完成得更快。

【问题讨论】:

  • 你使用的是哪个 git 版本?请考虑在 msysGit Google Group 或 git 邮件列表(git [at] vger.kernel.org,您不需要订阅)上寻求帮助,也许这是 git 中的一个错误。

标签: windows git


【解决方案1】:

你试过git gc吗?这会清除 git repo 中的垃圾。

【讨论】:

  • 这似乎成功了。我很惊讶,尽管只提交了几次,存储库就会有这么多可以清理的东西 - 谢谢!
  • 呵呵,我刚刚使用time 命令运行git status,得到了30.464 秒的“真实”时间。然后我再次运行git gc 然后time git status 并获得了35.409s 的实时时间。很奇怪。
  • 这将我的大部分存储库从 33 秒缩短到不到 1 秒。如果 Git 在您开始达到这一点时会告诉您这样做,那就太好了。我从不知道需要它。
  • 连续多次运行git status 时,后续运行只占第一次运行的一小部分。所以,如果你运行git status,然后是git gc,然后又是git status,预计它会运行得非常快。
【解决方案2】:

运行 git fsck 过去已经为我解决了这个问题。

【讨论】:

  • 这对我有用。可以解释一下。
【解决方案3】:

您是否在使用某种病毒防护软件?也许那是在干扰事情。 git 在拥有 1000 个文件存储库的 Windows 上对我来说非常快。

【讨论】:

  • 是的,雇主强制要求 TrendMicro OfficeScan。我杀死了病毒扫描程序,结果与 git status 相同。
  • 这个主题的另一个变体是即时加密软件,例如 Credant,它可以让你的盒子显着变慢。
  • 这对我来说是个问题。杀死卡巴斯基杀毒软件,状态恢复到
【解决方案4】:

您是否尝试过重新包装? git-repack.

否则,请尝试复制目录,并删除复制目录中的 .git 文件夹。然后新建一个git目录,看看是不是还是很慢。

如果仍然很慢,则听起来像是系统或硬件问题。 Git 在不到 5 秒的时间内为我完成了数百个文件的状态。

【讨论】:

  • repack 似乎有帮助 - 运行它后,我运行了 status,它立即返回。但是,我等了几秒钟,再次运行状态,花了 30 秒。我尝试复制目录,但遇到了同样的问题。
  • 嗯,很有趣。你有外部驱动器吗?还是 U 盘?尝试复制那里的回购,看看是否有任何区别。当前所在的驱动器可能存在问题。
  • 在 USB 驱动器上没有区别。
  • 这真的很奇怪。在这一点上我真的只能说我不知道​​。您可以尝试复制您的存储库并在其他人的计算机上进行尝试——这至少应该告诉您这是否是您系统本地的问题。
【解决方案5】:

在一个类似的问题上,我发现在我现有的 git repo 下的目录中有一个 git repo 会导致速度大大降低。

我将辅助 git repo 移到其他地方,现在速度很快!

【讨论】:

  • 我添加了类似的问题。发生的事情是 git init 在子目录中。问题在于,subdir 有点隐藏(你需要在里面做 git status 才能看到变化),但我猜 git 仍在尝试计算它们。我忽略了子目录,现在一切都很好。
【解决方案6】:

由于某种原因,git status 在将存储库文件夹移动或复制到新位置后特别慢。

在这种情况下,后续运行通常更快。

【讨论】:

  • 有没有办法在第一次运行时避免这种缓慢?我尝试了 git gc,但它没有帮助。这不是问题,因为它只在复制文件后的第一次发生。
  • 我不知道有什么方法可以避免最初的缓慢,但是如果有一些命令可以做到这一点,它可能会和最初的git status 命令做同样的事情,所以会可能需要相同的时间才能完成。
【解决方案7】:

我的git status 非常慢(最多一分钟),因为全局.gitignore 文件位于我的Windows 用户配置文件中,该文件存储在无法访问的网络共享中。

git config --global core.excludesfile
显示类似\\Nxxxx0\User\Username\Eigene Dateien\gitignore_global.txt

由于某种原因,\\Nxxxx0 无法访问,我的用户配置文件是从备份系统 \\Nxxxxx1 加载的。花了一些时间才弄清楚这一点,因为通常我的用户配置文件通过企业启动脚本绑定到一个驱动器号,并且访问该驱动器号正常工作。 我不确定为什么 git-config 使用网络共享而不是驱动器号(可能是我年轻的原因)

设置后
git config --global core.excludesfile $HOME/Eigene\ Dateien/gitignore_global.txt
git status恢复正常速度。

【讨论】:

    【解决方案8】:

    对我来说,速度慢是因为有很多未跟踪的文件(脚本中的临时和输出文件)。运行git status -uno,不包括未跟踪的文件,运行速度更快,并且符合我的要求

    【讨论】:

      【解决方案9】:

      旧版本的 git 存在 git status 的性能问题 - 请参阅 Ways to improve git status performance 了解更多信息。

      git 2.13 有 1 个修复,还有 2.17 更多。我从 2.7 移到 2.23,它解决了缓慢的状态。计划在 2.24 不久进行另一项改进。

      【讨论】:

        【解决方案10】:

        git status 的另一个方面将得到改进(在 Git 2.14.x/2.15,2017 年第四季度)当它也显示被忽略的文件时 (git status --ignored)

        git status --ignored”,当注意到一个目录没有任何 跟踪的路径被忽略,仍然枚举所有被忽略的路径 目录,这是不必要的。
        代码路径已经过优化以避免这种开销。

        参见Jameson Miller (jamill)commit 5aaa7fd(2017 年 9 月 18 日)。
        (由 Junio C Hamano -- gitster -- 合并于 commit 075bc9c,2017 年 9 月 29 日)

        提高git status --ignored的性能

        提高目录列表逻辑在列出非空忽略目录时的性能。为了显示非空的被忽略目录,现有逻辑将递归遍历被忽略目录的所有内容。
        此更改引入了优化以在找到第一个文件后停止迭代内容。这可以显着提高在被忽略目录中包含大量文件的存储库中的“git status --ignored”性能。

        有关示例存储库的性能差异示例 400 个被忽略的目录中的 196,000 个文件:

        | Command                    |  Time (s) |
        | -------------------------- | --------- |
        | git status                 |   1.2     |
        | git status --ignored (old) |   3.9     |
        | git status --ignored (new) |   1.4     |
        

        如需更多改进(设置于 Git 2.17,2018 年第二季度),请参阅 this answer

        【讨论】:

        • 此处完全随机示例:node_modules 可能会受到此性能更改的影响。只是也许。
        【解决方案11】:

        在我的例子中,这个 git 目录中有一个巨大的 ZIP 文件。 *.zip 也是 .gitignore 文件中的一行:

        CMakeCache.txt
        CMakeFiles
        Makefile
        cmake_install.cmake
        [...]
        *.csv
        *.zip
        [...]
        

        我已将此 zip 文件 (~915 MB) 移动到其他文件夹,这解决了问题。

        【讨论】:

          【解决方案12】:

          在我的例子中,运行速度慢是由于以不同于项目中文件所有者的用户身份运行 git status 造成的。

          虽然并非在所有情况下都适用,但对您当前的用户发送一个简单的chown 就可以解决问题。

          【讨论】:

            【解决方案13】:

            对我来说,问题是我有很多不同的存储库克隆到我的本地硬盘驱动器上,你拥有的存储库越多,运行 git status 等命令所需的时间就越长。

            我只是删除了很多本地不再需要的repos,我的git状态从1分钟到5秒。

            我在这里看不到任何类似的答案。

            【讨论】:

            • 我认为这不会以任何方式影响您在一个目录中运行的标准git status。如果您的存储库被检出到不同的目录中,您一次只能为其中一个运行git status。如果您的 git 存储库重叠,情况可能会有所不同,但无论如何这都是个坏主意。
            • @HubertGrzeskowiak 绝对可以。它们对我来说都在我硬盘上的不同位置,但它极大地影响了我在输入 git status 时的加载时间。删除重复的存储库后,它立即变得更快,从几分钟到 5 秒。
            【解决方案14】:

            尝试从结帐的全新克隆开始。

            git clone myrepo mynewrepo
            

            然后在 mynewrepo 中执行 git status。

            或者,如果您更勇敢,请清理现有结帐中的垃圾。

            git clean -dfx
            

            这避免了 git 必须扫描一些(可能很大)被忽略或未签入的文件集。

            【讨论】:

            • 我认为删除所有被忽略的文件(git clean 所做的)不会有帮助,它已经忽略了它们。更有可能运行 git clean 会删除你所有的配置文件等。而且这个命令是不可撤销的。重新克隆(首先保存旧的存储库以备不时之需)比运行 git clean 效果要好得多。
            • 我不同意这个答案,运行 git clean -dfx 可能会破坏事情。
            猜你喜欢
            • 2018-02-07
            • 2016-07-30
            • 2013-07-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多