我的理解是git在创建提交时基本上运行diff。
这至少是不正确的。提交时,Git只是简单地归档当前的索引,就像现在一样。在提交中没有差异;相反,它们是每次实际查看提交时动态生成的。
因此,您也有一些错误的想法。当你查看你最近一次提交的gitk
,gitk
实际上运行git diff
来产生你所看到的,所以如果你没有发现那么慢,那么git diff
根本就不是很慢。 :)
如果生成当前工作树的差异很慢,那么我怀疑这对您的文件系统来说比其他任何问题都更大。我从来没有发现它很慢,我甚至使用NFS。 (所以我必须承认,我不太了解你的文件系统可能会比这慢得多。)
或者,它可能只是位gitk
,这很慢。我从来没有用过它来审查存储库的当前状态,通常更喜欢git status
,git 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的性能。
如果你怀疑的差异,多久'混帐diff'走? –
当我的回购是肮脏的时候,我会尽力为它定时:)。我想说git的差异大约需要3或4秒 – Benmj
/磁盘您正在使用什么文件系统?存储库中有多少个文件? –