众所周知,我们可以定期运行git gc
以打包.git/objects
.
但是,对于远程中央 Git 存储库(裸或不裸),在多次推送之后,在myproj.git/objects
;下有很多文件。每个提交似乎都会在那里创建一个新文件。
我如何打包这么多文件?(我的意思是远程中央裸存储库上的那些,而不是本地克隆存储库上的那些。)
众所周知,我们可以定期运行git gc
以打包.git/objects
.
但是,对于远程中央 Git 存储库(裸或不裸),在多次推送之后,在myproj.git/objects
;下有很多文件。每个提交似乎都会在那里创建一个新文件。
我如何打包这么多文件?(我的意思是远程中央裸存储库上的那些,而不是本地克隆存储库上的那些。)
远程仓库应配置为在提交后根据需要运行 gc。请参阅gc.auto
ingit-gc
和git-config
手册页的文档。
但是,远程 repo 不需要那么多垃圾收集,因为它很少有悬空(无法访问)提交。这些通常是由分支删除和变基之类的事情引起的,这些事情通常只发生在本地仓库中。
所以重新打包需要更多的gc,这是为了节省存储空间而不是去除实际的垃圾。该gc.auto
变量足以解决此问题。
虽然您应该有一些过程可以定期自动处理这个问题,但运行起来没问题
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)...
经过多次推送,下面有很多文件
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.
这个问题应该能说明你应该多久运行一次垃圾收集。
最简单的选择是使用 Windows 中的计划任务或 Unix 中的 cron 作业git gc
定期运行。这样你甚至不需要考虑它。