git - 我需要在裸仓库上运行 git gc 吗?

标签 git git-gc

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

我知道您应该偶尔在本地存储库上运行 git gc 以修剪悬空对象并压缩历史记录等——但是共享的裸存储库是否容易受到这些相同问题的影响?

如果重要的话,我们的工作流程是多个开发人员从共享网络驱动器上的裸存储库中提取和推送。 “中央”存储库是使用 git init --bare --shared 创建的。

最佳答案

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

我刚刚在两个已被积极使用的裸共享存储库上运行 git gc --aggressive;一个在过去 3-4 周内提交了大约 38 次,而另一个在大约 3 个月内提交了大约 488 次。没有人在这两个存储库上手动运行 git gc

较小的存储库

$ 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 编辑这两个存储库之前就想到了它,但是我应该运行 git gc 而没有 --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

运行 git gc 显然对 count-objects 产生了很大的影响,即使我们定期 pushfetch 来自这个存储库。但在阅读the manpage for git config , 我注意到默认的松散对象限制是 6700,我们显然还没有达到。

所以看来结论是,您不需要需要在裸仓库上手动运行git gc* 但使用 gc.auto 的默认设置,可能需要很长时间才能自动进行垃圾回收。


* 一般,您不需要运行 git gc。但有时you might be strapped for space并且您应该手动运行 git gc 或将 gc.auto 设置为较低的值。不过,我提出这个问题的理由只是出于好奇。

关于git - 我需要在裸仓库上运行 git gc 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3532740/

相关文章:

git - 有没有办法限制 "git gc"使用的内存量?

git - 确定是什么阻止了从 git 中删除提交

git - 如何真正删除一个 git 分支(即删除它的所有对象/提交)?

android - 使用终端 IDE 从 Android 上的 GitHub 克隆

c# - 如何阻止 git 在 checkout 时破坏编码

git - 让Git在分支之间保留不同的section内容

git - 停止 git gc --aggressive,这是一件坏事吗?

git - 为Git配置了SSH key 但仍然不成功

javascript - 如何计算 git 树哈希?

git - `git gc` 和 `git repack -ad; git prune` 之间有什么区别吗?