Git倉庫刪除大文件


Git倉庫刪除大文件

背景

當用Git久了,難免會手誤或臨時添加一些大文件到倉庫中,即使以后添加進了.gitignore,甚至做了git rm,但是Git為了保證版本可回退,history pack里面依然會存儲這些對象,這個時候我們就要為Git倉庫進行瘦身。

或者不是大文件的情況,有時我們需要刪除掉一些敏感信息文件,比如password.txt,即使回退也無法找到敏感文件,要實現這個要求,也要對history pack進行清理。

清理主要做如下一些事情:

  1. 尋找想要徹底清理的文件路徑
  2. 查詢這個文件第一次出現的提交
  3. 從第一次出現的提交開始清理,重寫之后的所有提交,保證該文件在history中完全抹除
  4. 清理掉相關的引用,以及log信息
  5. 重新打包所有對象
  6. 推送至遠程倉庫以應用更新

所以做完了清理之后,既能夠保證Git還可以正常回溯,分支,tag,歷史變更這些都還保留;又能夠完全清理掉指定的文件。

操作思路

下面有2種途徑達到目的

  1. 可以使用BFG工具,操作簡單,鏈接為:https://rtyley.github.io/bfg-repo-cleaner/

  2. 如果喜歡自己倒騰,可以使用原生git命令組合實現,主要用到git filter-branch,其實BFG也是對該命令的封裝

詳細步驟

以第2種途徑來達成目的,親測可用,場景為 我在幾個月前推送了一批鏡像文件到倉庫中,雖然git rm移除了,但history pack中依然保留了數據 。汗…

以下步驟均在工程根目錄下操作

  1. 尋找大文件是哪些

鏡像已經移除掉了,我需要尋找到它們曾經在哪里。以下命令羅列出整個倉庫中前10個最大文件對象。該命令運行需要等待一段時間

$ git verify-pack -v .git/objects/pack/pack-43035f03d78ed39da647d4685e427bd126209bdb.idx | sort -k 3 -n | tail -10
e28b267b24de7d5b32ed2391669df8a72e24257d blob   162449408 62757122 757958127
c32c8b1da1c6283b250402aa31cde35051a52b3d blob   177733120 59785053 1360726301
711c9b581771981c54b4637497ceeb4bb23012bd blob   188976128 70107988 2347396900
d5cb26ac04328a255e922a24ea271ee50901c59d blob   196414976 74351707 1500585499
f93b48272597886796fc03d54e281f2403bea5ed blob   199080448 44716221 1455869278
247b35b36ef4c9f980c8cf967712788539980e5d blob   244180480 88897974 820715249
71848a6b5cb31639f8770553ddf6222573755d3d blob   414519296 140712921 100780869
d69f7af4727d15ee563aead6eff1d8baff61105d blob   1295518720 427812890 330145237
a3a36f25a9c3d610cb4d4eea381314ecf7b1510d blob   1324011520 443360428 909613223
c32670dfb49ae6a5948517fb6d19f78812a840ad blob   1802148352 617108853 1730288047

2.查找對應路徑

發現e28b267b24de7d5b32ed2391669開頭的對象最大,我們來看看它指代了哪個路徑

$ git rev-list --objects --all | grep e28b267b24de7d5b32ed2391669
e28b267b24de7d5b32ed2391669df8a72e24257d backEnd/vendor/history/dockerimages/fabric-baseos

3.查找第一次出現該文件的log

從上個命令找到了大文件的曾經存在過的路徑,現在查找log看看第一次提交該文件的版本號,結果列表里面最下面一個即為第一次,例如下面的722113f8a88。其實這一步不是必須的,因為清理可以從頭清理到尾,全面覆蓋。

$ git log --pretty=oneline --branches -- backEnd/vendor/history/dockerimages/fabric-baseos
486eac3085e25e9cec8c2de35c1e09cf79a5134e update 
5fb74121be3fe311428068dd02837406a5d8f173 update 
1380ead7f038a4b23add4fd64e9b66cb678cd6b5 commit something
a49db09fb148aabf51223d73fbcdb71e103610a0 update
722113f8a88e03cafebe7bbfcb6de20ffb068387 push

4.開始清理history

$ git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch backEnd/vendor/ILIOS/dockerimages/fabric-baseos' --prune-empty --tag-name-filter cat -- --all
Rewrite 6aeecaec3cfb419313bfb5516048b0979a6f284f (236/251) (11 seconds passed, rRewrite 2e5b34a51afb5a43f6b5d3e4400bfa0400629a4e (236/251) (11 seconds passed, rRewrite 914c89a1ea1e325f8be990c47cb71eaf88c29649 (236/251) (11 seconds passed, remaining 0 predicted)    
WARNING: Ref 'refs/heads/branch1' is unchanged
WARNING: Ref 'refs/heads/master' is unchanged
Ref 'refs/heads/branch2' was rewritten
WARNING: Ref 'refs/remotes/origin/master' is unchanged
WARNING: Ref 'refs/remotes/origin/branch1' is unchanged
WARNING: Ref 'refs/remotes/origin/master' is unchanged
Ref 'refs/remotes/origin/branch2' was rewritten

5.清理所有廢棄的引用

git verify-pack -v .git/objects/pack/pack-7b03cc896f31b2441f3a791ef760bd28495697e6.idx \
| sort -k 3 -n \
| tail -10
git rev-list --objects --all | grep 185ab8d
git log --pretty=oneline --branches -- spark-assembly-1.3.1-hadoop2.4.0.jar
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch spark-assembly-1.3.1-hadoop2.4.0.jar' \
--prune-empty --tag-name-filter cat -- --all
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now
git count-objects -v
git push origin --force --all

參考文章:

  1. https://help.github.com/articles/removing-sensitive-data-from-a-repository/

  2. http://blog.csdn.net/zcf1002797280/article/details/50723783

  3. https://github.com/18F/C2/issues/439

  4. http://blog.csdn.net/vite_s/article/details/52315867

  5. http://blog.csdn.net/lwfcgz/article/details/49453375


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM