Pea*_*ful 5 git version-control git-checkout git-branch
我使用的是 Ubuntu 17.10,并且使用 git(版本 2.14.1)。每当我从 master 创建一个分支并尝试签出到它(或从它到 master)时,都会花费大量时间,大约几分钟,有时接近 10 分钟。确实,我有几 GB 的数据,但据我了解,整个数据实际上并没有被复制,而是只保存了更改。那么这背后的问题可能是什么?
小智 6
你应该跑步git gc来提高表现。
git gc\xe2\x80\x98 的目的有两个:删除松散对象和打包对象以更有效地使用磁盘空间。
\n\n\n在当前存储库中运行许多内务任务,例如压缩文件修订版(以减少磁盘空间并提高性能)以及删除可能是通过先前调用 git add 创建的无法访问的对象。
\n
https://git-scm.com/docs/git-gc
\n虽然 Git 2.20 和 2.21 提高了git checkout性能(请参阅下面的下一节),但自 Git 2.23(2019 年 8 月)以来,您应该git switch改用.
Git 2.24(2019 年第 4 季度)git switch获得了性能提升。
这确实会影响git checkout -bOP 使用的内容。
请参阅Derrick Stolee ( )的提交 3136776(2019 年 8 月 29 日)。(由Junio C Hamano 合并 -- --在提交 3ff6af7中,2019 年 9 月 30 日)derrickstolee
gitster
checkout:添加对“git checkout -b”的简单检查创建'
git switch' 命令是为了分隔 ' ' 的一半行为git checkout。如果用户仅指定创建新分支并更改
HEAD到该分支,那么它特别具有对索引和工作目录不执行任何操作的模式。
这也是大多数用户期望“ ”的行为git checkout -b,但由于历史原因它还通过扫描工作目录来执行索引更新。即使对于中等规模的回购来说,
这也可能很慢。fa655d8
git checkout -b引入了针对“ ”的性能修复(:optimize " " 2018-08-16,Git v2.20.0-rc0)。该更改包括需要稀疏结帐功能时 有关配置设置的详细信息。 此更改检测此行为更改是否安全的方式是通过该方法。 这种方法很复杂,需要随着新选项的引入而更新。checkoutgit checkout -b <new_branch>checkout.optimizeNewBranchskip_merge_working_tree()此行为本质上已被65f099b恢复(“
switch:除非发生真正的分支切换,否则没有工作树状态”2019-03-29,Git v2.23.0-rc0)。
相反,使用 的两个成员checkout_opts struct来区分 'git checkout' 和 'git switch':Run Code Online (Sandbox Code Playgroud)* `switch_branch_doing_nothing_is_ok` * `only_merge_on_switching_branches`这些设置具有相反的值,具体取决于我们是否从
cmd_checkout或开始cmd_switch。65f099b的消息包括“鼓励大型存储库的用户进行切换。 ”在 ' ' 仍处于实验阶段
时进行此更改过于激进。git switch
git checkout -b <branch>通过使 ' ' 的行为就像 ' ' 一样,在这两个选项之间创建一个折中方案git switch,但前提是我们准确地读取这些参数。
必须这样做cmd_checkout以避免选项解析逻辑消耗参数。这与fa655d8之前的更改不同 ,配置选项
checkout.optimizeNewBranch仍被删除。
这意味着git checkout -b即使我们有一个稀疏签出文件,''也会忽略索引合并。
虽然这是“ ”的行为更改git checkout -b,但它与“ ”的行为相匹配git switch -c。
Git 2.20 (Q4 2018) 将提高git checkout速度:
“ git checkout -b newbranch [HEAD]”不应该像检查与 HEAD 不同的提交那样做。
尝试对这种特殊情况进行优化。
请参阅Ben Peart ( )提交的 fa655d8(2018 年 8 月 16 日)。(由Junio C Hamano 合并 -- --在提交 0faaf7e中,2018 年 9 月 17 日)benpeart
gitster
checkout: 优化 ”git checkout -b <new_branch>”
git checkout -b <new_branch>.当且仅当我们通过“ ”创建新分支时,跳过合并提交、更新索引和工作目录,
任何其他签出选项仍将通过以前的代码路径。如果
sparse_checkout打开,则要求用户通过将配置设置设置为 true 来手动选择此优化行为,checkout.optimizeNewBranch因为我们将不再更新skip-worktree索引中的位,也不再添加/删除工作目录中的文件以反映当前的稀疏结帐设置。为了进行比较,在大型存储库上运行“
git checkout -b <new_branch>”需要:
14.6 seconds - without this patch
0.3 seconds - with this patch
Run Code Online (Sandbox Code Playgroud)
Git 2.21(2019 年第一季度)进一步优化git checkout,因为git checkout -b <new> [HEAD]“用于从当前提交创建新分支并检查它在正常情况下应该是索引和工作树中的无操作,但有一些极端情况确实需要更新索引和工作树。
在“”之后立即运行它git clone --no-checkout是早期优化错误启动的情况之一,该问题已得到修复。
请参阅Ben Peart ( )提交的提交 8424bfd和提交 91e3d7c(2019 年 1 月 23 日)。(由Junio C Hamano 合并 -- --提交5ad3550,2019年 2 月 5 日)benpeart
gitster
checkout:修复checkout -b初始结账时的回归问题执行“
checkout -b”时,请执行完整的检出,包括在执行初始检出时更新工作树。
由于新测试涉及文件系统访问,因此请在序列中稍后进行,以便为其他更便宜的测试提供提前离开的机会。这修复了由fa655d8
引起的行为回归(:优化“ ”,2018-08-16,Git 2.20)。checkoutgit checkout -b <new_branch>