我一直在試圖編寫了涉及把下面的代碼post-receive
git的鉤一個實驗:git gc:垃圾收集是否在post-receive中被禁用?
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」而不是在命令提示符下運行垃圾收集時可能會有不同行爲的任何想法?
謝謝,我會嘗試重新包裝。但我的主要觀點是關於在post-receive中運行上述代碼之間的結果差異,而不是之後在命令提示符下手動輸入它。我不明白爲什麼會有所作爲。 –