刪除 git 倉庫中無用大文件


刪除 git 倉庫中無用大文件

這兩天整理公司很多舊的代碼倉庫,上傳到在線項目平台。因為存儲空間容量有限,所以需要先把一些倉庫中的無用大文件刪除掉,以節約占用存儲空間。

1、找到大文件

在代碼倉庫目錄下執行命令

# 如果是純版本庫,那么這里的 .git/objects/pack/pack-*.idx 應改為 objects/pack/pack-*.idx
git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -g | tail -5

輸出結果如下,依次是文件ID文件類型文件字節數size-in-packfiloffset-in-packfile

f628e3087f5e32c2c84f2f7d534e744df31511e1 blob   348670 347901 444010
3e2109358e393b52d0583c28cae8d3b36a4d3c41 blob   503391 146406 59027
21e3ba4aad85cc3ae2cb7e666196b008cac0fbae blob   752709 150644 288525
2832523cb6c5daa0dffac74e4388a11e20af9f64 blob   1415831 297634 10476233
0a160bb8b890e3347121f4c6113e7292f4a279df blob   22888095 9603172 791911

根據文件的ID(SHA1),查找文件路徑

> git rev-list --objects --all | grep 0a160bb8b890e3347121f4c6113e7292f4a279df
0a160bb8b890e3347121f4c6113e7292f4a279df my-project/src/assets/images/地球1.jpg

上面的合為一個腳本

#!/bin/bash
LISTS=`git verify-pack -v objects/pack/pack-*.idx | sort -k 3 -g | tail -5`
for item in ${LISTS};
do
        if [ `expr length ${item}` -eq 40 ];then
                git rev-list --objects --all | grep ${item}
        fi
done

2、將要刪除的大文件從各個分支中移除

執行下面命令,將文件從分支的提交中移除

# 文件名可以寫多個。git rm 可添加 -r 參數,遞歸刪除目錄。還可以使用 *.dll *.pdb 這樣的通配符匹配模式
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch 文件名' --prune-empty --tag-name-filter cat -- --all

輸出示例如下:

> git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch my-project/src/assets/images/地球1.jpg' --prune-empty --tag-name-filter cat -- --all
WARNING: git-filter-branch has a glut of gotchas generating mangled history
         rewrites.  Hit Ctrl-C before proceeding to abort, then use an
         alternative filtering tool such as 'git filter-repo'
         (https://github.com/newren/git-filter-repo/) instead.  See the
         filter-branch manual page for more details; to squelch this warning,
         set FILTER_BRANCH_SQUELCH_WARNING=1.
Proceeding with filter-branch...

Rewrite b3012a355f8abbd77aafd3bbe061b2a9d6fc2209 (6/75) (0 seconds passed, remaining 0 predicted)    rm 'my-project/src/assets/images/地球1.jpg'
Rewrite 2f46fe9d8f7e41e0fc4fc0c974dfe9d53a7ae16e (7/75) (0 seconds passed, remaining 0 predicted)    rm 'my-project/src/assets/images/地球1.jpg'
Rewrite 48eacdbaac7be54447becb6ba2299c7af7342018 (8/75) (0 seconds passed, remaining 0 predicted)    rm 'my-project/src/assets/images/地球1.jpg'
Rewrite 33dc9bc35ef8ba91d8a7a3ee438cffbc76ae731c (9/75) (0 seconds passed, remaining 0 predicted)    rm 'my-project/src/assets/images/地球1.jpg'
Rewrite 66797c81a7d0661b598ae1208e890a789cc5a431 (10/75) (0 seconds passed, remaining 0 predicted)    rm 'my-project/src/assets/images/地球1.jpg'
Rewrite 7b256cae45d2ffd8066e46e0908be61e8550eb88 (11/75) (0 seconds passed, remaining 0 predicted)    rm 'my-project/src/assets/images/地球1.jpg'
Rewrite e3356d4320f060c9d4bf92ae0c6a2ecd02d62e30 (12/75) (0 seconds passed, remaining 0 predicted)    rm 'my-project/src/assets/images/地球1.jpg'
Rewrite 5b86b0a737ce4d42cd9554cddcdd3da0c637ebf6 (13/75) (1 seconds passed, remaining 4 predicted)    rm 'my-project/src/assets/images/地球1.jpg'
Rewrite 77f6eff022bcfdf28a450829a8f6e678d37e1b29 (13/75) (1 seconds passed, remaining 4 predicted)    rm 'my-project/src/assets/images/地球1.jpg'
Rewrite b270af3f52c39115024d211d75b67af235ee4e86 (13/75) (1 seconds passed, remaining 4 predicted)    rm 'my-project/src/assets/images/地球1.jpg'
Rewrite 0ce2b7e593d7e679e2b4f4d0f1d214ad3c301818 (13/75) (1 seconds passed, remaining 4 predicted)    rm 'my-project/src/assets/images/地球1.jpg'
Rewrite 26f080f7fc6d4feb6833d8db6aa4b8a55f44f092 (13/75) (1 seconds passed, remaining 4 predicted)    rm 'my-project/src/assets/images/地球1.jpg'
Rewrite 1281c094b358354e108e1461ee0dd395dd3b7127 (13/75) (1 seconds passed, remaining 4 predicted)    rm 'my-project/src/assets/images/地球1.jpg'
Rewrite d0166fea8ae38c73e615e95e73e6913df1e37901 (13/75) (1 seconds passed, remaining 4 predicted)    rm 'my-project/src/assets/images/地球1.jpg'
Rewrite 6a5aafcc51e68a6bf3b3ac08ad0e3a01f8b240fc (55/75) (2 seconds passed, remaining 0 predicted)    rm 'my-project/src/assets/images/地球1.jpg'
Rewrite 22e415058e646ab3870c0ea4c0ffca179ad0a739 (55/75) (2 seconds passed, remaining 0 predicted)    rm 'my-project/src/assets/images/地球1.jpg'
Rewrite 83cf6f3db88c423184d9a1eec22c5c23841d492a (55/75) (2 seconds passed, remaining 0 predicted)
Ref 'refs/heads/20180115' was rewritten
Ref 'refs/heads/ese_v2_sge20180111' was rewritten
Ref 'refs/heads/master' was rewritten
Ref 'refs/heads/online_sge20180111' was rewritten
Ref 'refs/heads/show_localhost' was rewritten
Ref 'refs/heads/show_lyd20180315' was rewritten
Ref 'refs/tags/attachment' was rewritten
Ref 'refs/tags/ese_v1.03_online20180321' was rewritten
Ref 'refs/tags/ese_v1.07_show20180321' was rewritten
Ref 'refs/tags/ese_v1.08_online20180323' was rewritten
Ref 'refs/tags/ese_v1.08_show20180323' was rewritten
Ref 'refs/tags/ese_v1.09_online20180323' was rewritten
Ref 'refs/tags/ese_v1.10_show20180528' was rewritten

3、刪除緩存下來的ref和git操作記錄

git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
git reflog expire --expire=now --all
# 或者這樣寫也行
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin && git reflog expire --expire=now --all

4、垃圾回收

上面2步把大文件的索引都切斷了,這個時候進行垃圾回收,就可以很明顯看到效果了

git gc --prune=now

這時候的倉庫就已經是刪除了大文件的了,把倉庫推送到新的遠程倉庫或者強制推送到遠程倉庫都是可以的。

git remote add newremote https://xxxxxx.com/xxxx/xxx.git
git push -u --all newremote

參考


免責聲明!

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



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