与其他版本控制系统相比,git checkout有多贵?

时间:2011-08-19 21:57:08

标签: git

我不完全确定git如何实现检出,但可能是它正在删除磁盘上的文件(对应于工作副本),并从其内部表示中将文件写入工作副本。所以在我看来,如果你有一个包含大量文件的项目,就磁盘I / O而言,git checkout应该是一件昂贵的事情。但通常似乎并不需要这么长时间(尽管我可能只是处理小到足以让它无关紧要的存储库)。那么git是以比我想象的更聪明的方式做到这一点,或者是否有其他考虑因素在这里,或者事实上git checkout是昂贵的,我只是没注意到因为我有好处足够的硬件?

3 个答案:

答案 0 :(得分:3)

如果您完全在项目的两个几乎完全不同的方面之间进行交换,以便通用性最小化,并且差异很大,那么git和其他VCS系统都需要删除并替换整个数据负载。在这一点上,实现效率很重要,即使在那里,git通常也有优势,因为它有一个完整的本地文件副本,而不是必须忍受你和远程网络之间的网络延迟回购。

如果您只是在项目的相当类似版本中的分支之间交换,那么您有很多预先存在的共性,并且git知道这一点,所以不需要为这些文件做任何事情。它需要做的只是一点文件恢复,你已经完成了。

Plus git通常针对速度进行优化。 git@vger.kernel.org线程通常具有速度优化和速度比较,因此它很重要,但其他一些系统并不总是如此 - 拥有本地仓库是关键!

答案 1 :(得分:2)

这是苹果和橘子。例如,git checkoutsvn revert的共同点多于svn checkout

git checkout仅适用于本地文件系统。 git pushgit pull用于与远程存储库同步,git clone用于下载远程存储库。

实际git checkout将您的工作文件夹与本地存储库进行比较,并将文件更新为存储库的版本。全部在本地完成,并且带有与'git status'或'svn status'大致相同的开销。

答案 2 :(得分:0)

就像@Doug Kress所说,git checkout是你的盒子的本地。性能仅基于IO性能和文件系统的效率。因此,真正的考虑因素是文件系统效率低下或IO性能不佳。

来自git update-index手册:

  

git中的许多操作都依赖于您的文件系统来提高效率   lstat(2)实现,使st_mtime信息为工作树   可以廉价地检查文件以查看文件内容是否已更改   从索引文件中记录的版本。不幸的是,一些   文件系统lstat(2)效率低下。如果您的文件系统是其中之一   它们,您可以将“假设未更改”位设置为您未更改的路径   导致git不做这个检查。

http://www.kernel.org/pub/software/scm/git/docs/git-update-index.html