【问题标题】:git gc: Is garbage collection disabled in post-receive?git gc:垃圾收集是否在接收后禁用?
【发布时间】: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


    【解决方案1】:

    Git 激进的垃圾收集可能没有达到您的预期。 Linus 在此处发布了有关此内容的信息。但它也已在其他帖子中介绍过:

    【讨论】:

    • 谢谢,我会尝试重新打包。但我的主要观点是关于在接收后运行上述代码与之后在命令提示符中手动输入它之间的结果差异。我不明白为什么这会有所作为。
    【解决方案2】:

    好的,我想我已经弄明白了。它实际上与是否处于接收后没有任何关系。

    关于引发这个问题的问题的更多信息。我有一个存储库,称之为“repo”。对该存储库的最后一次提交是一个巨大的文件,称为“BigFatFile.bin”,大小为 4 MB。此文件不应在存储库中。所以我试图解决这个问题是这样的:

    1. 克隆存储库。
    2. 执行git reset --hard 删除最后一次提交。

    这些步骤设法从克隆的存储库中删除“BigFatFile.bin”。不过,这次推送的效果还是看得见的,因为.git目录还是很大的:“BigFatFile.bin”的4MB仍然体现在.git/objects/pack目录中

    此时,我可以尝试各种清理命令来尝试摆脱“BigFatFile.bin”的影响:

    git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
    git reflog expire --expire=now --all
    git repack -a -d -f --depth=250 --window=250
    git gc --aggressive --prune=now --force
    

    这些步骤对.git 的大小没有显着影响。然而,我发现如果我在git reset --hard 之后立即执行git push -f origin master,然后然后 执行清理步骤,.git 的大小将恢复到“BigFatFile.bin”之前的大小"被推了。这并不能解决我的问题(因为虽然克隆的存储库恢复原样,但原始存储库的大小仍然臃肿)。但是,它确实回答了我关于为什么垃圾收集(和其他清理措施)没有效果的问题:在我“推送”我的更改之前,.git 必须不仅维护文件的本地内容,而且还维护它们的原始内容。

    所以我最初的问题(为什么没有在本地清理工作)得到了回答,虽然我仍然不知道真正问题的答案,即如何重置远程存储库以使其不显示效果“BigFatFile.txt”的提交

    【讨论】:

    • 我不确定这是一个答案,更多的是用关于 gc 做什么的新知识来阐述你的问题。也就是说,如果您正在寻找答案,这可能是问题的一部分。
    猜你喜欢
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 2014-08-26
    • 2023-03-30
    • 1970-01-01
    相关资源
    最近更新 更多