如何把舊的 git commit 歷史記錄移除掉

發佈於:

最近在替一些過分肥大的 git 倉庫抽脂瘦身 (?) 。順便記錄一下這個把舊的 commit 歷史記錄移除掉的方法。

$DIGEST 是個 commit id:

git replace --graft $DIGEST
git filter-branch

這麼做完之後,$DIGEST 之前的歷史就會消失了。不過 branch 中所有 commit id 全部會變過。$DIGEST 這個 commit id 本身也會變幻為另一個而消失。如 果這倉庫有多處複本的話,大家都要重新 clone

幾年前並沒有 git-replace 這支指令,弄起來複雜多了,不過看來也出現 一陣子了。跑git-filter-branch 下去則是會把目前 branch 整條從頭到 尾重新 commit 一次,基本上很類似於 rebase 到一個新的 root commit 上, 但有一不同之處為起始狀態並非空的,而是會等同於 $DIGEST 當時的狀態。

不做 git-filter-branch 這一步其實也可以省略。但這樣一來就只是讓 git log 等指令不會往更舊的歷史追去,實質上 .git/ 目錄中的舊內容是沒有被清除掉的。