在Git结账时发生了什么?

时间:2015-05-19 22:23:00

标签: git git-checkout internals

我注意到,如果我是主人,然后我会检查一个特别老的分支(让我们说......一两个月),大约需要10秒钟。一旦我检查出来,如果我从这个分支切换回主分支,或从主分支切换回这个分支,结账速度将减少到大约1秒。

我知道当你进行git checkout时,指针正在改变(即,指向ref的HEAD文件,然后指向所有关联的对象)。但是git checkout引擎盖下还有什么呢?为什么在你完成一次之后,两个分支之间的结账流程会加快?

我们是否正在打包这些线上的对象或东西?我想象一下,如果我们检查一个分支,我们希望所有相关内容都是松散的对象形式,因为它似乎更容易获得并且易于编辑而不是git gc最终将它们打包到的增量。

谢谢!

2 个答案:

答案 0 :(得分:3)

除了更新头文件和reflog文件(不花时间)之外,唯一做的就是找到压缩对象(有时是打包的),解压缩它们并填充工作目录。 我认为时间的差异仅仅是由于内存/磁盘/ CPU缓存。没有更多......

答案 1 :(得分:0)

Git 2.13说明了git checkout的更多内容,通过它提出的优化:
commit b986df5查看commit 06b6d81commit e549463commit 350d870commit a6db3fb(2017年4月19日)和Jeff Hostetler (jeffhostetler)(2017年4月14日)。{br /> (由Junio C Hamano -- gitster --合并于commit 6cbc478,2017年4月26日)

它教导has_dir_name()add_index_entry_with_check()在尝试搜索新项目之前,查看新项目的路径是否大于索引数组中的最后一个路径。

添加:

  

在结帐时,merge_working_tree()按排序顺序填充新索引,因此此更改将保存每个文件的二进制查找。

     

has_dir_name()正在寻找索引中的文件/目录冲突,并且必须依次考虑每个子目录前缀。
  这可能导致每个路径进行多次二进制搜索。

commit b986df5中查看大型回购的收益。