代码之家  ›  专栏  ›  技术社区  ›  Mark Rushakoff

我是否需要在裸回购上运行GitGC?

  •  38
  • Mark Rushakoff  · 技术社区  · 14 年前

    man git-gc 它没有一个明显的答案,而且我在谷歌也没有任何运气(尽管我可能只是使用了错误的搜索词)。

    我知道你应该偶尔跑步 git gc 在本地存储库中,删除悬挂的对象并压缩历史等等——但是共享的裸机存储库是否容易受到这些问题的影响?

    如果这很重要,我们的工作流程就是多个开发人员从共享网络驱动器上的一个裸存储库中拉出并推送到该存储库中。“中央”存储库是用创建的 git init --bare --shared .

    5 回复  |  直到 9 年前
        1
  •  29
  •   Community CDub    8 年前

    AS Jefromi 评论 Dan's answer , git gc 应该 在“正常”使用裸存储库期间自动调用。

    我只是跑 git gc --aggressive 在两个已被积极使用的共享存储库上,一个存储库在过去的3-4周内提交了大约38个,另一个存储库在大约3个月内提交了大约488个。没有人手动运行 气相色谱-气相色谱法 在任一存储库上。

    较小的存储库

    $ git count-objects
    333 objects, 595 kilobytes
    
    $ git count-objects -v
    count: 333
    size: 595
    in-pack: 0
    packs: 0
    size-pack: 0
    prune-packable: 0
    garbage: 0
    
    $ git gc --aggressive
    Counting objects: 325, done.
    Delta compression using up to 4 threads.
    Compressing objects: 100% (323/323), done.
    Writing objects: 100% (325/325), done.
    Total 325 (delta 209), reused 0 (delta 0)
    Removing duplicate objects: 100% (256/256), done.
    
    $ git count-objects -v
    count: 8
    size: 6
    in-pack: 325
    packs: 1
    size-pack: 324
    prune-packable: 0
    garbage: 0
    
    $ git count-objects
    8 objects, 6 kilobytes
    

    更大的存储库

    $ git count-objects
    4315 objects, 11483 kilobytes
    
    $ git count-objects -v
    count: 4315
    size: 11483
    in-pack: 9778
    packs: 20
    size-pack: 15726
    prune-packable: 1395
    garbage: 0
    
    $ git gc --aggressive
    Counting objects: 8548, done.
    Delta compression using up to 4 threads.
    Compressing objects: 100% (8468/8468), done.
    Writing objects: 100% (8548/8548), done.
    Total 8548 (delta 7007), reused 0 (delta 0)
    Removing duplicate objects: 100% (256/256), done.
    
    $ git count-objects -v
    count: 0
    size: 0
    in-pack: 8548
    packs: 1
    size-pack: 8937
    prune-packable: 0
    garbage: 0
    
    $ git count-objects
    0 objects, 0 kilobytes
    

    我希望我早就想到了 gc Ed这两个存储库,但我应该运行 气相色谱-气相色谱法 没有 这个 --aggressive 选择查看差异。幸运的是,我还有一个中等规模的活动存储库需要测试(在近2个月内提交164个)。

    $ git count-objects -v
    count: 1279
    size: 1574
    in-pack: 2078
    packs: 6
    size-pack: 2080
    prune-packable: 607
    garbage: 0
    
    $ git gc
    Counting objects: 1772, done.
    Delta compression using up to 4 threads.
    Compressing objects: 100% (1073/1073), done.
    Writing objects: 100% (1772/1772), done.
    Total 1772 (delta 1210), reused 1050 (delta 669)
    Removing duplicate objects: 100% (256/256), done.
    
    $ git count-objects -v
    count: 0
    size: 0
    in-pack: 1772
    packs: 1
    size-pack: 1092
    prune-packable: 0
    garbage: 0
    
    $ git gc --aggressive
    Counting objects: 1772, done.
    Delta compression using up to 4 threads.
    Compressing objects: 100% (1742/1742), done.
    Writing objects: 100% (1772/1772), done.
    Total 1772 (delta 1249), reused 0 (delta 0)
    
    $ git count-objects -v
    count: 0
    size: 0
    in-pack: 1772
    packs: 1
    size-pack: 1058
    prune-packable: 0
    garbage: 0
    

    运行 气相色谱-气相色谱法 显然在 count-objects 即使我们经常 push 向和 fetch 从这个储存库。但在阅读时 the manpage for git config ,我注意到默认的松散对象限制是6700,这显然还没有达到。

    所以看来结论是 你不会 需要 运行 气相色谱-气相色谱法 手动进行裸回购; * 但默认设置为 gc.auto ,可能需要很长时间才能自动进行垃圾收集。


    * 一般来说 你不需要跑 气相色谱-气相色谱法 . 但有时 you might be strapped for space 你应该跑 气相色谱-气相色谱法 手动或设置 通用汽车公司 到一个较低的值。不过,我提出这个问题的理由很简单,就是好奇。

        2
  •  14
  •   Dan Moulding    14 年前

    git-gc 人页:

    鼓励用户在 每个 知识库 保持良好的磁盘空间利用率和良好的操作 性能。

    强调我的。裸存储库也是存储库!

    进一步解释:一个内务管理任务 气相色谱-气相色谱法 执行是 包装 重新包装 松散物体。即使你从来没有 晃来晃去的 对象在您的裸存储库中,随着时间的推移,您将积累大量松散的对象。为了提高效率,这些松散的物体应该定期打包。类似地,如果大量的包装累积起来,它们应该定期重新包装成更大(更少)的包装。

        3
  •  2
  •   VonC    9 年前

    问题与 git gc --auto 是因为它会阻塞。

    但新的(2014年第二季度2.0吉特)设置 gc.autodetach ,您现在可以在不中断的情况下执行此操作:

    commit 4c4ac4d commit 9f673f9 ( Nguyễn Thái Ngọc Duy, aka pclouds ):

    gc --auto 需要时间,并且可以暂时阻止用户(但不会减少任何麻烦)。
    使其在支持它的系统的后台运行。
    在后台运行时唯一丢失的就是打印输出。但是 gc output 不是很有趣。
    您可以通过更改 自卸车 .


    注:只有Git 2.7(2015年第4季度)才能确保 不释放错误消息 .
    commit 329e6e8 (2015年9月19日) Nguyễn Thái Ngọc Duy ( pclouds ) .
    (合并) Junio C Hamano -- gitster -- 在里面 commit 076c827 ,10月15日2015日)

    gc :保存后台监控的日志 气相色谱-汽车 下次再打印

    同时 提交9F67 3F9 ( GC :用于运行的配置选项 --auto 背景-2014-02-08)有助于减少有关 气相色谱-汽车 “占用终端,会造成另一组问题。

    此集合中最新的是,由于守护进程, stderr 关闭,所有警告丢失。结束时的警告 cmd_gc() 尤其重要,因为它告诉用户如何避免 气相色谱-汽车 “重复运行。
    因为stderr是关闭的,用户不知道,自然会抱怨' 气相色谱-汽车 浪费CPU。

    守护的 GC 现在保存 标准错误 $GIT_DIR/gc.log .
    跟随 气相色谱-汽车 不会运行和 gc.log 直到用户删除 GC-LoC
    .

        4
  •  1
  •   svick Raja Nadar    14 年前

    一些操作正在运行 git gc --auto 自动的,所以不应该有 需要 运行 git gc ,Git应该自己解决这个问题。

    与Bwawok所说的相反,您的本地回购与裸回购之间实际上存在(或可能存在)差异:您对其进行的操作。例如,可以通过重新平衡来创建悬空对象,但您可能从未重新平衡裸repo,因此您可能不需要删除它们(因为从来没有任何对象)。因此,您可能不需要使用 气相色谱-气相色谱法 经常这样。但是,再一次,就像我说的,Git应该自动处理这个问题。

        5
  •  0
  •   bwawok    14 年前

    我不完全了解GC的逻辑。但为了解决这个问题:

    GitGC删除了额外的历史记录垃圾,压缩了额外的历史记录等。它与您的本地文件副本无关。

    裸回购和普通回购之间的唯一区别是,如果您有文件的本地副本。

    所以,我认为这是合理的,你应该在一个空回购上运行GitGC。

    我从未亲自操作过它,但我的回购非常小,而且仍然很快。

    推荐文章