1. 程式人生 > 實用技巧 >使用bfg快速清理git歷史大檔案

使用bfg快速清理git歷史大檔案

目錄

使用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不能拉取程式碼了,重啟伺服器解決了