git gc:收到后是否禁用了垃圾收集?

时间:2015-09-08 13:38:23

标签: git garbage-collection git-post-receive

我一直在尝试编写一个实验,该实验涉及将以下代码放在post-receive git hook中:

unset GIT_DIR
cd (path to some temp directory outside the repository)
git clone --local (path to repository just pushed to) .
git checkout dev
git reset --hard HEAD^
git reflog expire --expire=now --all
git gc --aggressive --prune=now

基本上我正在做的是克隆刚推到的存储库,执行硬重置以删除最后一次提交,然后进行垃圾收集以从历史记录中删除最后一次提交的痕迹。为了检查垃圾收集是否真正发挥作用,我在最后一次提交时提交了一个巨大的4 MB文件,然后检查.git的大小以查看它是否已被删除。

所以当我在git“post-receive”钩子里运行这段代码时,重置似乎工作正常;克隆的存储库返回没有巨大文件的状态。但是,垃圾收集似乎没有用。 .git的大小仍然很大。

另一方面,如果我此时从命令行手动运行“git reflog”和“git gc”,它会正确删除大文件的痕迹,并将.git的大小恢复为可管理的大小

任何想法为什么垃圾收集在“post-receive”中运行时可能会有不同的行为,而不是在命令提示符下运行?

1 个答案:

答案 0 :(得分:1)

Git积极的垃圾收集可能没有做你期待的事情。 Linus在这里发布了这个。但它也被其他帖子所涵盖: