我注意到,如果我是主人,然后我会检查一个特别老的分支(让我们说......一两个月),大约需要10秒钟。一旦我检查出来,如果我从这个分支切换回主分支,或从主分支切换回这个分支,结账速度将减少到大约1秒。
我知道当你进行git checkout时,指针正在改变(即,指向ref的HEAD文件,然后指向所有关联的对象)。但是git checkout引擎盖下还有什么呢?为什么在你完成一次之后,两个分支之间的结账流程会加快?
我们是否正在打包这些线上的对象或东西?我想象一下,如果我们检查一个分支,我们希望所有相关内容都是松散的对象形式,因为它似乎更容易获得并且易于编辑而不是git gc最终将它们打包到的增量。
谢谢!
答案 0 :(得分:3)
除了更新头文件和reflog文件(不花时间)之外,唯一做的就是找到压缩对象(有时是打包的),解压缩它们并填充工作目录。 我认为时间的差异仅仅是由于内存/磁盘/ CPU缓存。没有更多......
答案 1 :(得分:0)
Git 2.13说明了git checkout的更多内容,通过它提出的优化:
请commit b986df5查看commit 06b6d81,commit e549463,commit 350d870,commit 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中查看大型回购的收益。