【问题标题】:Why is committing code so much faster than running diff?为什么提交代码比运行 diff 快得多?
【发布时间】:2014-02-11 23:17:14
【问题描述】:

我喜欢在向上游推送之前检查我的提交,所以我总是在提交之前运行gitk(我喜欢一点视觉效果)。不过,我注意到,先提交代码然后运行 ​​gitk 会快得多。

慢一点:

  1. [带有未提交的更改]
  2. gitk
  3. 查看未提交的更改

快一点:(还没有计时,但它似乎是即时的,而不是几秒钟的延迟)

  1. git 提交
  2. gitk
  3. 查看上次提交
  4. 根据需要恢复或修改。

我的理解是 git 在创建提交时基本上会运行差异。那么,为什么 diff 未提交的代码比提交和审查最后一次提交需要更长的时间呢?

【问题讨论】:

  • 如果您怀疑存在差异,git diff 需要多长时间?
  • 当我的仓库很脏时我会尝试计时:)。我会说 git diff 大约需要 3 或 4 秒
  • 您使用的是什么文件系统/磁盘?存储库中有多少个文件?
  • “存储库中有多少文件?” -- 仅供参考,即使对 Linux 内核源代码树进行 diff 对我来说甚至都不需要半秒。跨度>
  • repo 很大,但没那么大。它有大约 10,000 个文件,刚刚超过 400mb。我已将其检出到在 Macbook pro 上运行的 Windows 7 的虚拟副本上。

标签: git git-commit git-diff gitk


【解决方案1】:

我的理解是 git 在创建提交时基本上会运行差异。

至少,这不是真的。提交时,Git 只是将当前索引完全按原样存档。提交中没有差异;相反,它们是在您每次实际查看提交时动态生成的。

因此,在某种程度上,您也有错误的想法。当您使用 gitk 查看您的最后一次提交时,gitk 实际上会运行 git diff 来生成您所看到的内容,所以如果您没有发现那么慢,那么 git diff 根本不慢。 :)

如果生成当前工作树的差异很慢,那么我怀疑这更多的是您的文件系统的问题。我从来没有发现它很慢,我什至使用 NFS。 (所以我必须承认我不太明白你的文件系统怎么会比这慢得多。)

或者,它可能只是有点慢gitk。我从来没有用它来检查存储库的当前状态,通常更喜欢git statusgit diff 和/或git gui。 (我确实使用gitk,但几乎只用于查看历史和/或历史提交。)

几个提示:

  • gitk 在后台运行,而不是每次都重新启动它。
  • 检查运行 git diff 本身是否与启动 gitk 一样慢。
  • 为了确定,运行git gc 来优化存储库。

编辑:既然你已经提到你使用 Windows 7 运行,那么应该提到 Linus 在评论 Git 的设计时引用了他已经大量使用他的了解 Linux 内核文件系统实现以提高 Git 的速度。那么,将工作树与索引进行比较的速度很慢的原因很可能是 Windows 7 的文件系统调用速度比 Linux 慢和/或根本不喜欢 Git 使用文件系统的方式。

This thread on the Git mailing list 似乎与您遇到的问题相同,只是更糟。它有这样的报价,除其他外:

我认为简单的现实是 Git 是根据假设编写的 该统计数据很便宜,但在 Windows 上并非如此,在 Windows 上 文件系统缓存似乎在这方面做得不好。

This answer on SO 提到了一个用于 msysgit 的补丁,它显着提高了 Windows 的性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 2012-03-03
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多