git checkout to a branch需要很长时间

时间:2018-02-16 09:20:43

标签: git version-control git-branch git-checkout

我在Ubuntu 17.10上,我正在使用git(版本2.14.1)。每当我从master创建一个分支并尝试签出它(或从它的主人),它需要花费很多时间,大约几分钟,有时几乎10分钟。是的,我有几GB的数据,但据我所知,整个数据实际上并没有被复制,而只保存了更改。那背后的问题可能是什么呢?

2 个答案:

答案 0 :(得分:2)

您应该运行git gc来帮助提升效果。

addon.xml的目的有两个:删除松散的对象并打包对象以更有效地使用磁盘空间。

  

在当前存储库中运行许多内务处理任务,例如压缩文件修订版(以减少磁盘空间并提高性能)以及删除可能从先前调用git add创建的无法访问的对象。

https://git-scm.com/docs/git-gc

答案 1 :(得分:1)

Git 2.20(2018年第四季度)将提高git checkout的速度:

git checkout -b newbranch [HEAD]”不必像签出不同于HEAD的提交那样做。
试图优化这种特殊情况。

请参见commit fa655d8Ben Peart (benpeart)(2018年8月16日)。
(由Junio C Hamano -- gitster --commit 0faaf7e中合并,2018年9月17日)

  

checkout:优化“ git checkout -b <new_branch>

     

仅当我们通过“ git checkout -b <new_branch>.”创建新分支时,才跳过合并提交,更新索引和工作目录的操作
  其他任何签出选项仍将通过以前的代码路径。

     

如果sparse_checkout处于打开状态,则要求用户通过将配置设置checkout.optimizeNewBranch设置为true来手动选择此优化行为,因为我们将不再更新菜单中的skip-worktree位索引,也不能在工作目录中添加/删除文件以反映当前的稀疏签出设置。

     

为了进行比较,在大型仓库上运行“ git checkout -b <new_branch>”需要执行以下操作:

14.6 seconds - without this patch
0.3 seconds - with this patch

Git 2.21(2019年第一季度)进一步优化了git checkout,因为git checkout -b <new> [HEAD]“用于从当前提交创建一个新分支,并检查它应该是索引中的空操作,并且正常情况下是工作树,但是有些极端情况确实需要更新索引和工作树。

在“ git clone --no-checkout”之后立即运行它是其中之一 先前的优化未正确启动的情况 已修复。

请参见commit 8424bfdcommit 91e3d7cBen Peart (benpeart)(2019年1月23日)。
(由Junio C Hamano -- gitster --commit 5ad3550中合并,2019年2月5日)

  

checkout:修复了checkout -b初始结帐时的回归现象

     

进行“ checkout -b”时,请进行完整的结帐,包括更新工作流程   初始结帐时的树。
  由于新测试涉及文件系统访问,因此请按顺序进行后续操作,以使其他便宜的测试有机会提早离开。
  这修复了由fa655d8引起的行为回归(checkout:优化“ git checkout -b <new_branch>”,2018-08-16,Git 2.20)。