【发布时间】:2015-09-11 03:33:58
【问题描述】:
我一直在尝试编写一个实验,其中涉及将以下代码放入 post-receive git 钩子中:
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”中运行时可能会表现不同,而不是在命令提示符下运行?
【问题讨论】:
标签: git garbage-collection git-post-receive