当我们这样做时git会做什么:git gc - git prune

时间:2018-05-02 13:27:22

标签: git garbage-collection git-gc

启动时在后台进行的操作,

  • git prune
  • Counting objects: 945490, done. Delta compression using up to 4 threads. Compressing objects: 100% (334718/334718), done. Writing objects: 100% (945490/945490), done. Total 945490 (delta 483105), reused 944529 (delta 482309) Checking connectivity: 948048, done.

输出 git gc

Checking connectivity: 945490, done.

输出 git prune

AwesomeForm.UpdateMe()

这两个选项有什么区别?

谢谢

1 个答案:

答案 0 :(得分:1)

由于最近添加了 git maintenance command(Git 2.29(2020 年第 4 季度)),git gc -prune 的替代品将是:

git maintenance pack-refs
# for
git pack-refs --all --prune

在 Git 2.31(2021 年第一季度)中,“git maintenance(man) 工具学习了一项新的 pack-refs 维护任务。

commit acc1c4dcommit 41abfe1(2021 年 2 月 9 日),作者 Derrick Stolee (derrickstolee)
(2021 年 2 月 17 日在 Junio C Hamano -- gitster --commit d494433 合并)

<块引用>

maintenance:添加 pack-refs 任务

签字人:Derrick Stolee
审核人:Taylor Blau

<块引用>

将松散的引用收集成更压缩的形式是很有价值的。
这通常是packed-refs文件,尽管这可能是未来的reftable。
在具有许多标签或远程分支的存储库中,打包 refs 可能非常有价值,这些标签或远程分支未被本地用户修改,但对于其他查询仍然是必需的。

例如,有许多分解的引用,诸如

之类的命令
git describe --tags --exact-match HEAD

可能会很慢(多秒)。
此命令特别用于终端提示,以显示分离的 HEAD 何时指向现有标签,因此速度缓慢会导致用户显着延迟。

添加新的“pack-refs”维护任务。
它运行 'git pack-refs --all --prune'(man) 将松散的引用移动到打包的形式中。
目前,这是packed-refs 文件,但将来可能会调整为其他文件格式。

这是'gc'任务的几个子任务中的第一个,可以提取到他们自己的任务中。
在此过程中,我们不应更改“gc”任务的行为,因为这仍然是保持存储库维护的默认方式。
为这些子任务之一创建新任务只会为那些选择不使用“gc”任务的人提供更多自定义选项。
当然可以同时启用“gc”和“pack-refs”任务并定期运行。
虽然他们可能会重复努力,但不会以破坏性的方式发生冲突。

'auto_condition' 函数指针暂时留在 NULL
我们可以在将来扩展此功能,以检查是否应在 'git maintenance run --auto'(man) 期间运行 pack-refs。

git maintenance 现在包含在其 man page 中:

<块引用>

pack-refs

pack-refs 任务收集松散的参考文件并 将它们收集到一个文件中。这加快了操作 需要遍历多个引用。

并且它可以按计划运行,作为其新的 pack-refs 任务的一部分:

<块引用>

maintenance:增量策略每周运行 pack-refs

签字人:Derrick Stolee
审核人:Taylor Blau

<块引用>

当“maintenance.strategy”配置选项设置为“incremental”时,会启用默认维护计划。
以每周的节奏将“pack-refs”任务添加到该策略中。

git config 现在包含在其 man page 中:

<块引用>

任务,但每小时运行 prefetchcommit-graph 任务, loose-objectsincremental-repack 每日任务,以及 pack-refs 每周任务。


git maintenance register(man) 命令无法注册裸存储库,该问题已在 Git 2.31(2021 年第一季度)中得到纠正。

请参阅 commit 26c7974Eric Sunshine (sunshineco)(2021 年 2 月 23 日)。
(2021 年 2 月 25 日在 Junio C Hamano -- gitster --commit d166e8c 合并)

<块引用>

maintenance:使用裸仓库修复不正确的 maintenance.repo 路径

报告人:Clement Moyroud
签字人:Eric Sunshine

<块引用>

git maintenance start(man)配置的定期维护任务调用git for-each-repo(man)运行git maintenance run(man) 在多值全局配置变量 maintenance.repo 指定的每个路径上。
由于 git for-each-repo 可能会在需要定期维护的存储库之外运行,因此 maintenance.repo 指定的存储库路径必须是绝对路径。

然而,不幸的是,git maintenance register(man) 没有做任何事情来确保它分配给 maintenance.repo 的路径确实是绝对的,并且实际上可能 - - 特别是在裸仓库的情况下 - 为 maintenance.repo 分配一个相对路径。
通过在将所有路径分配给 maintenance.repo 之前将它们转换为绝对路径来解决此问题。

同时,还要修复 git maintenance unregister(man) 以将路径转换为绝对路径,以确保它可以正确地从 {{1 }} 通过 maintenance.repo 分配的路径。