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

时间:2010-07-02 01:43:42

标签: git repository git-gc

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

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

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

4 个答案:

答案 0 :(得分:48)

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

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

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

答案 1 :(得分:13)

虽然您应该有一些流程可以定期自动处理,但运行

是没有问题的
git gc

在裸存储库

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)...

答案 2 :(得分:4)

This question应该说明你应该多久进行垃圾收集。

最简单的选择是使用Windows中的计划任务或Unix中的cron作业定期运行git gc。这样你甚至不需要考虑它。

答案 3 :(得分:3)

  

经过多次推送后,myproj.git/objects

下有很多文件

git 2.11 +(2016年第4季度)和预先接收的钩子不会同样多。
在这种情况下,您不必在所有中触发git gc

commit 62fe0eb,见commit e34c2e0commit 722ff7fcommit 2564d99commit 526f108Jeff King (peff)(2016年10月3日)。 Junio C Hamano -- gitster --于2016年10月17日commit 25ab004合并)

  

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

     

为了接收端" git push"为了检查接收到的历史记录并决定拒绝推送,从发送端发送的对象需要可用于挂钩和连接检查机制,这通常是通过将对象存储在接收存储库中并让出" git gc"过期

     

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

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

这样,如果某个(大)推送被pre-receive挂钩拒绝,那些大型物品将会在90天内等待git gc清理它们。< / p>