查找大文件
git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"
結(jié)果
zsh: no matches found: .git/objects/pack/*.idx
4fa9c4356393c0a3047a64e2662d5b624a471b3e
47e9174f93476eb8fb744c66b2060bd5bdb7d6a7
ec51f3c438af85e9835c53fc251cfd714e7a0bfc
5cee5c2988f361e20d7c1e3bc9a91c3eb42864e5
3257e94bc49f743d49efb53db26e619df26be0c5
f66e46b3c12602662f33ddf8b0c99d91e8a279ef
a0b12cc5d48ae90065210b441f3d6c1a33378b37
c74105573fb0312738746de0718449565b36ac58 jczr.rar
bece93b911880583437964207f2c4a2252881d0e read.md
5fa55fe49a260ed6e9665d31685b2ef61b1bf376 readme2.md
e60b15a71c46199a36955fc0da55d45d69e89388
204f7e33b29397657ddcd35e8971db46e0753486 dawenjian.zip
20f192ea673667322a769f7765159bed736ceeab
9eef28535c062025b7354695c2a6cfffebb210a0 read.md
8b062a810b9473aeb6f697f67898a21120f3d4aa readme2.md
359618d9f4efdeefb94453cb172b96b36e2743ae
0b61c06e8627abb75f01da05f583592dd486f9ba
ef0ef318e3c167d67016b0b9bc5149d6b2f19dce read.md
0eb689f0b4e75f72ecf14a9b54d34cd1e2ab79fa
8494906e9a9b585fc75640034d8b5f59f67297d2 read.md
- 第一行是文件id
- 第二行是文件路徑
刪除大文件
在Git
倉庫徹底刪除一個文件只有一種辦法:重寫(Rewrite)
涉及該文件的所有提交苇本。 幸運(yùn)的是借助git filter-branch
便可以重寫歷史提交蕊程,當(dāng)然這也是Git
中最危險的操作。 可以說比rm -rf *
危險一萬倍介返。
git filter-branch -f --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch dawenjian.zip' --tag-name-filter cat -- --all
--index-filter
參數(shù)用來指定一條Bash命令,然后Git會檢出(checkout)所有的提交享钞, 執(zhí)行該命令号胚,然后重新提交。我們在提交前移除了recent-badge.psd文件酸役, 這個文件便從Git的所有記錄中完全消失了
--all
參數(shù)告訴Git我們需要重寫所有分支(或引用)住诸。
unmatch
后面跟文件的路徑
此時我們使用查找大文件的命令查找文件,發(fā)現(xiàn)那些文件還是在簇捍。怎么回事呢只壳?因?yàn)闆]清理緩存。下面我們看下怎么清理緩存暑塑。
清理git 緩存
Git
倉庫歷史有個緩存期吼句,如果不主動回收、清理倉庫歷史事格,一般的這些記錄還會保存一段時間惕艳,以備你突然后悔了搞隐,沒辦法找回刪掉的文件。那么怎么樣才能主動回收資源能远搪?就是通過以下命令:
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now
比較清理前后的提交信息變化
清理前的提交日志
這里我再添加一個大文件和一個說明文件劣纲,添加后提交。
執(zhí)行git log -p
命令查看提交內(nèi)容谁鳍,如下所示
清理后的提交日志
很顯然日志未發(fā)生任何變化
主動刷新后的提交日志變化
很顯然癞季,在提交日志里,根本看不到我們提交過什么大文件倘潜,只有和大文件同時提交的記錄文件還在绷柒。那說明我們把大文件的提交記錄清除了。
溫馨提示
大文件已經(jīng)提交到遠(yuǎn)程倉庫
如果這些文件已經(jīng)提交到遠(yuǎn)程倉庫了涮因,那么現(xiàn)在就有一個問題废睦,遠(yuǎn)程倉庫的提交記錄和本地的提交記錄不一致。只能強(qiáng)制提交或者強(qiáng)制update
- 強(qiáng)制提交
git push origin master -force
,本地代碼強(qiáng)制覆蓋遠(yuǎn)程代碼倉庫的代碼 - 強(qiáng)制覆蓋遠(yuǎn)程版本到本地养泡,最后的代碼就是遠(yuǎn)程倉庫的版本
git fetch --all
git reset --hard origin/master
大文件不曾提交到遠(yuǎn)程倉庫
如果大文件不曾提交到遠(yuǎn)程倉庫嗜湃,則可以處理了大文件后,直接提交到倉庫澜掩。