64

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

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

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

4

4 回答 4

51

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

但是,远程 repo 不需要那么多垃圾收集,因为它很少有悬空(无法访问)提交。这些通常是由分支删除和变基之类的事情引起的,这些事情通常只发生在本地仓库中。

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

于 2010-07-02T05:35:24.653 回答
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)...
于 2011-06-13T00:23:41.940 回答
5

经过多次推送,下面有很多文件myproj.git/objects

git 2.11+(2016 年第四季度)和预接收挂钩不会那么多。在这种情况下,您根本
不必触发 a 。git gc

请参阅Jeff King ( )的提交 62fe0eb提交 e34c2e0提交 722ff7f提交 2564d99提交 526f108(2016 年 10 月 3 日) 。(由Junio C Hamano 合并 -- --提交 25ab004中,2016 年 10 月 17 日)peff
gitster

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

为了让“git push”的接收端检查接收到的历史并决定拒绝推送,需要使从发送端发送的对象可供钩子和连接检查机制使用,并且这样做了传统上通过将对象存储在接收存储库中并让 " git gc" 使其过期。

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

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

That way, if a (big) push is rejected by a pre-receive hook, those big objects won't be laying around for 90 days waiting for git gc to clean them up.

于 2016-10-25T06:13:45.290 回答
3

这个问题应该能说明你应该多久运行一次垃圾收集。

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

于 2010-07-02T01:54:07.610 回答