为什么提交代码比运行diff快得多?

时间:2014-02-11 23:17:14

标签: git git-commit git-diff gitk

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

慢:

  1. [未提交更改]
  2. gitk
  3. 审核未提交的更改
  4. 相当快一点:(没有计时,但它似乎是即时的,而不是几秒滞后)

    1. git commit
    2. gitk
    3. 审核上次提交
    4. 根据需要恢复或修改。
    5. 我的理解是git在创建提交时基本上运行了差异。那么,为什么需要花费这么长时间才能提交未提交的代码而不是提交和查看最后一次提交?

1 个答案:

答案 0 :(得分:2)

  

我的理解是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上并非如此   文件系统缓存似乎没有那么好。

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