使用bfg快速清理git歷史大檔案
阿新 • • 發佈:2020-09-19
目錄
使用bfg快速清理git歷史大檔案
之前寫過一篇的,使用的git命令清理的大檔案,但是我3G多的git,.git資料夾裡面的pack就3G多,而且是個好幾年並且在持續開發的專案,裡面的提交成千上萬了,每次使用
git filter-branch
,都要好幾個小時,我研究了一下,要徹底清理專案中的那一堆大檔案,只要要用指令碼連續跑兩天。。。
最近發現了一個方案,使用bfg,我僅僅十幾分鍾就處理完了
原先的方案:https://blog.csdn.net/qq_36254947/article/details/108601940
步驟
- 解除保護分支
預設情況下,git專案是有一個保護分支的
- 拉取程式碼
注意:需要ssh拉取,http不行(ssh拉取需要配置ssh金鑰)
git配置ssh金鑰
git clone --mirror git專案的ssh地址
# 拉取的是 專案名.git 資料夾,這是Git專案中的.git資料夾
- 檢視大檔案
# 進入專案資料夾 cd xxx.git # 查詢大檔案 git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print$1}')" # tail -n 代表檢視前n個大檔案,
- 清理資料夾
java -jar bfg-1.13.0.jar --delete-folders 清理的資料夾名字 本地git專案地址
# 注意:資料夾名字,而不是資料夾路徑,要小心別把其他資料夾中的同名的資料夾刪除了
# 若是jar包放到了 git專案中,不需要新增 本地git專案地址 ,但最好不要放到.git資料夾中
- 清理檔案
java -jar bfg-1.13.0.jar --delete-files 刪除的檔名 本地git專案地址
# 注意:這是檔名只是名字部分,不包含路徑
- 清理無效檔案
# 刪除的檔案和資料夾,需要這一步才會真正清除 git reflog expire --expire=now --all && git gc --prune=now --aggressive
- 檢視大小
git count-objects -vH
# 此時就能發現專案小了
- 推送
git push -f # -f 強制推送
指令碼
# 開始
time1=$(date)
echo 開始時間 $time1
echo 拉取專案
git clone --mirror [email protected]
jarpach="D:\test1\bfg-1.13.0.jar" # jar包地址
cd "D:\轉換\test1\xxx.git" # git專案地址
git count-objects -vH
echo
echo
echo
echo 清理檔案提交
echo
# 將需要清理的檔案列出來
java -jar $jarpach --delete-folders 資料夾1
java -jar $jarpach --delete-folders 資料夾2
java -jar $jarpach --delete-files dist.*
java -jar $jarpach --delete-files 檔案2
echo
echo
echo 清理無效檔案
echo git reflog expire --expire=now --all && git gc --prune=now --aggressive
echo
echo
echo 清理完成
git count-objects -vH
echo
time2=$(date)
echo 開始時間 $time1 ---結束時間 $time2
清理完之後,若是沒有問題,進入專案資料夾使用git push -f
強制推送即可,之後別忘記清理伺服器
清理伺服器
清理完檔案之後,需要清理一下伺服器
#從git伺服器進入這個專案的.git資料夾
cd /var/opt/gitlab/git-data/repositories/xx/.git #根據配置可能不同
# 清理檔案
git gc --prune=now --aggressive
#檢視大小
git count-objects -vH
注意:我清理完之後,git伺服器使用http不能拉取程式碼了,重啟伺服器解決了