如何在Git远程存储库上触发垃圾回收?

pet*_*ang 51 git repository git-gc

众所周知,我们可以定期运行git gc以打包对象.git/objects.

对于远程中央Git存储库(裸或不),经过多次推送后,下面有很多文件myproj.git/objects; 每次提交似乎都在那里创建一个新文件.

我该如何打包那么多文件?(我的意思是远程中央裸存储库上的那些,而不是本地克隆存储库.)

Nei*_*hew 48

远程仓库应配置为在提交后根据需要运行gc.请参阅git-gc和git-config手册页中的gc.auto文档.

但是,远程仓库不需要那么多垃圾收集,因为它很少会有悬空(无法访问)提交.这些通常来自分支删除和变基,这通常只发生在本地存储库中.

所以gc更需要重新打包,这是为了节省存储空间而不是去除实际的垃圾.gc.auto变量足以解决这个问题.

  • 不必要.如果我们推动一个bugfix分支让几个人在上面进行协作,那么在合并到master时做一个rebase,我们实际上是在远程中进行rebase.即使我们不执行变基,远程仓库仍应经常打包,以便新人可以更快地克隆. (3认同)

小智 13

虽然你应该有一些过程定期,自动地处理这个,但运行没问题

git gc
Run Code Online (Sandbox Code Playgroud)

在一个裸存储库

git@domU:/pix/git/repositories/abd.git$ ls -l

total 28
drwxrwxr-x   2 git git    6 2010-06-06 02:44 branches
-rw-rw-r--   1 git git   66 2010-06-06 02:44 config
-rw-r--r--   1 git git   23 2011-03-15 18:19 description
-rw-rw-r--   1 git git   23 2010-06-06 02:44 HEAD
drwxrwxr-x   2 git git 4096 2010-06-06 02:44 hooks
drwxrwxr-x   2 git git   20 2010-06-06 02:44 info
drwxrwxr-x 260 git git 8192 2010-09-01 00:26 objects
drwxrwxr-x   4 git git   29 2010-06-06 02:44 refs

$ git gc
Counting objects: 3833, done.
Compressing objects:  31% (1085/3500)...
Run Code Online (Sandbox Code Playgroud)

  • 他在 GitHub 上询问如何远程执行此操作 (2认同)

Von*_*onC 5

多次推送后,下有很多文件 myproj.git/objects

git 2.11+(2016 年第 4 季度)和 pre-receive hook 不会有那么多。
在这种情况下,你不会有触发git gc 所有

请参阅Jeff King ( ) 的commit 62fe0ebcommit e34c2e0commit 722ff7fcommit 2564d99commit 526f108(2016 年 10 月 3 日(由Junio C Hamano合并-- --commit 25ab004,2016 年 10 月 17 日)peff
gitster

receive-pack: 隔离对象直到预接收接受

为了让“git push”的接收端检查接收到的历史记录并决定拒绝推送,从发送端发送的对象需要提供给钩子和连接检查机制,这已经完成了传统上通过将对象存储在接收存储库中并让“ git gc”使其过期。

相反,将新接收的对象存储在临时区域中,并仅在我们决定是否接受检查时通过对它们重用备用对象存储机制使它们可用,一旦我们决定,要么将它们迁移到存储库,要么立即清除它们.

该临时区域将由新的环境变量设置GIT_QUARANTINE_ENVIRONMENT

那样的话,如果一个(大)推被一个pre-receive钩子拒绝了,那些大物体将不会放置 90 天等待git gc清理它们。