我一直在尝试编写一个实验,该实验涉及将以下代码放在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”中运行时可能会有不同的行为,而不是在命令提示符下运行?
答案 0 :(得分:1)
Git积极的垃圾收集可能没有做你期待的事情。 Linus在这里发布了这个。但它也被其他帖子所涵盖: