1. 程式人生 > >git清理歷史記錄中的大檔案

git清理歷史記錄中的大檔案

檢視哪些歷史提交過檔案佔用空間較大

使用以下命令可以檢視佔用空間最多的五個檔案:

1 gitrev-list--objects--all|grep"$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"

rev-list命令用來列出Git倉庫中的提交,我們用它來列出所有提交中涉及的檔名及其ID。 該命令可以指定只顯示某個引用(或分支)的上下游的提交。

--objects:列出該提交涉及的所有檔案ID。

--all:所有分支的提交,相當於指定了位於/refs下的所有引用。

verify-pack命令用於顯示已打包的內容。

重寫commit,刪除大檔案

使用以下命令,刪除歷史提交過的大檔案:

1 gitfilter-branch--force--index-filter'git rm -rf --cached --ignore-unmatch big-file.jar'--prune-empty--tag-name-filtercat----all

上面指令碼中的  big-file.jar 請換成你第一步查出的大檔名,或者這裡直接寫一個目錄(也支援目錄刪除)。

filter-branch命令可以用來重寫Git倉庫中的提交

--

index-filter引數用來指定一條Bash命令,然後Git會檢出(checkout)所有的提交, 執行該命令,然後重新提交。

–all引數表示我們需要重寫所有分支(或引用)。

在重寫提交的過程中,會有以下日誌輸出:

12 Rewrite6cdbb293d453ced07e6a07e0aa6e580e6a5538f4(266/266)#Ref'refs/heads/master'wasrewritten

如果顯示  xxxxxunchanged, 說明repo裡沒有找到該檔案, 請檢查路徑和檔名是否正確,重複上面的指令碼,把所有你想刪除的檔案都刪掉。

推送修改後的repo

以強制覆蓋的方式推送你的repo, 命令如下:

gitpushorigin--force--tags

其中 --tags表示關聯的標籤也會一併更新,如果不更新已有的標籤版本庫依舊會很大(特別是github)。

清理和回收空間

雖然上面我們已經刪除了檔案, 但是我們的repo裡面仍然保留了這些objects, 等待垃圾回收(GC), 所以我們要用命令徹底清除它, 並收回空間,命令如下:

12345 rm-rf.git/refs/original/gitreflogexpire--expire=now--allgitgc--prune=now

至此,我們已經徹底的刪除了我們不想要的檔案。

參考連結: