Git 缓慢枚举不存在的未跟踪文件



我正在使用 git 对存储库进行源代码控制。最近它开始警告我使用git status时枚举未跟踪的文件需要多长时间:

$ git status
On branch my_branch
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
    modified:   My_Project/my_source.c

It took 3.24 seconds to enumerate untracked files. 'status -uno'
may speed it up, but you have to be careful not to forget to add
new files yourself (see 'git help status').
no changes added to commit (use "git add" and/or "git commit -a")

但是,此存储库中没有未跟踪的文件 - 我检查了git status -uall.其他一些可能相关的信息:

  • 我注意到,只有当git status确实需要几秒钟才能运行时,才会出现此警告。
  • 我的存储库目前是 130.6 MB。
  • 我的构建产品都是树外的。

为什么 git 需要这么长时间来枚举不存在的未跟踪文件?


以下是一些相关的其他问题:

  • 提高 Git 状态性能的方法
  • Git 状态需要很长时间才能完成

首先,我想感谢Sven Marnach上面的评论,它基本上给了我这个解决方案。

问题:我也遇到了这个问题,但我的HD很好。 在 SSD 驱动器上执行"git 状态"需要 3-5 秒,在磁性驱动器上执行"git 状态"需要 4-8 秒。在我做了几次之后,它的速度要快得多。 我还看到这个错误,关于枚举未跟踪的文件需要很长时间,但我没有要提交的更改。

快速解决方案:删除 .gitignore 文件隐藏的任何文件。

更好的解决方案:停止在源代码管理中的同一目录中生成。

原因:Git 仍然需要遍历所有未跟踪的文件,看看是否有任何新文件,然后根据 .gitignore 中的条目交叉引用它们。 此错误并不是说您有需要签入的文件,而是说这些天需要很长时间才能确定是否有文件需要签入。

在干净结账时,git ignore 和 SSD 驱动器没有要隐藏的文件,运行"git 状态"需要 0.8 秒。

最后一点:这是一个非常古老的项目,我们有一个非常大的.gitignore 文件。 我怀疑将 100 个条目减少到一个目录也会有所帮助,但不幸的是,我们在每个输出目录中都有一些已签入的文件。

我的解决方案是删除.gitignore的完整文件路径,并在可能的情况下忽略目录

只是要注意我的 gitignore 有 15000 行长。

只是为了澄清作者在最新评论中给出的解决方案:

我已经更换了我的驱动器,因为没有遇到这个问题。

问题不在于git本身,而在于计算机硬件。
更换硬盘后 - 问题已解决。

最新更新