gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 13:31:18 26 4
gpt4 key购买 nike

git gcgit repack -ad 有区别吗? git 修剪?
如果是,git gc 将完成哪些额外步骤(反之亦然)?
就空间优化或安全性而言,使用哪个更好?

最佳答案

Is there any difference between git gc and git repack -ad; git prune?

不同之处在于,默认情况下 git gc 对于需要哪些内务处理任务非常保守。例如,它不会运行 git repack 除非存储库中松散对象的数量超过某个阈值(可通过 gc.auto 变量配置)。此外,git gc 将运行比 git repackgit prune 更多的任务。

If yes, what additional steps will be done by git gc (or vice versa)?

根据documentation , git gc 运行:

  • git-prune
  • git-reflog
  • git-repack
  • git-rerere

更具体地说,通过查看 source code of gc.c (lines 338-343)1我们可以看到它最多调用以下命令:

  • pack-refs --all --prune
  • reflog expire --all
  • repack -d -l
  • 修剪 --expire
  • worktree prune --expire
  • rerere gc

取决于包的数量(lines 121-126) ,它可能会使用 -A 选项运行 repack (lines 203-212) :

* If there are too many loose objects, but not too many
* packs, we run "repack -d -l". If there are too many packs,
* we run "repack -A -d -l". Otherwise we tell the caller
* there is no need.
if (too_many_packs())
add_repack_all_option();
else if (!too_many_loose_objects())
return 0;

关于line 211-212 of the need_for_gc function的通知如果存储库中没有足够的松散对象,gc 根本不会运行。

documentation 中进一步阐明了这一点:

Housekeeping is required if there are too many loose objects or too many packs in the repository. If the number of loose objects exceeds the value of the gc.auto configuration variable, then all loose objects are combined into a single pack using git repack -d -l. Setting the value of gc.auto to 0 disables automatic packing of loose objects.

If the number of packs exceeds the value of gc.autoPackLimit, then existing packs (except those marked with a .keep file) are consolidated into a single pack by using the -A option of git repack.

如您所见,git gc 努力根据存储库的状态做正确的事情。

Which one is better to use in regard to space optimization or safety?

一般来说,运行 git gc --auto 会更好,因为它会做最少的必要工作来保持存储库的良好状态——安全且不会浪费太多资源。

但是,请记住垃圾回收可能已经在某些命令后自动触发,除非通过将 gc.auto 配置变量设置为 0 来禁用此行为>.

来自documentation :

--auto
With this option, git gc checks whether any housekeeping is required; if not, it exits without performing any work. Some git commands run git gc --auto after performing operations that could create many loose objects.

因此对于大多数存储库,您不需要经常显式运行 git gc,因为它已经为您处理好了。


<子> 1. 截至提交 a0a1831制作于 2016-08-08。

关于git - `git gc` 和 `git repack -ad; git prune` 之间有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38848334/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com