前言
Git 作為一個(gè)分布式的版本管理工具,代碼倉庫中是會(huì)保存所有歷史記錄的。雖然,Git 的 .gitignore 文件里可以定義一些忽略文件的規(guī)則,但是,在我們提交代碼的過程中,總會(huì)不小心誤提一些沒用的文件,如果文件中存在大文件,就會(huì)導(dǎo)致:就算我們把它刪了重新提交,.git 文件夾依然會(huì)占用較大的空間。
如何解決這個(gè)問題呢?其實(shí),Git 已經(jīng)為我們提供了解決方案,就是被稱為核彈級的命令 filter-branch。這個(gè)命令可以用來修改歷史提交記錄,把不需要的文件永久地從歷史記錄中刪除。
方法如下:
首先,我們需要找出大文件。
找出排名前 5 的 pack 記錄:
1
|
git verify-pack - v .git /objects/pack/pack- *.idx | sort -k 3 -g | tail -5 |
可以看到這樣的信息:
1
2
3
4
5
|
1753e0b6aa1cd3ed27d1d14e8e569664c685e896 blob 44600 43841 37970 ca12c545eae19d688ac840c7f0e2e623a1a4192b blob 45262 8534 140448 7a3265ee94c0ab25cf079ac8ccdf87f41d455d42 blob 54708 49093 171307 72590cee1315e32dada25535184dcee97c6f5af9 blob 1114323 1104823 113887612 4cc1f9dcef1004355d2a595d45808e99f100dc4d blob 114592569 113703558 184054 |
最后一條就是最大的一條記錄,4cc1f9dcef1004355d2a595d45808e99f100dc4d 是它的 id。
找出該記錄對應(yīng)的文件:
1
|
git rev-list --objects --all | grep 4cc1f9dcef1004355d2a595d45808e99f100dc4d |
可以看到:
1
|
4cc1f9dcef1004355d2a595d45808e99f100dc4d app /src/main/assets/Android 群英傳.pdf |
這個(gè)文件就是罪魁禍?zhǔn)祝剂擞?100 多 M 的空間。
將該文件從歷史記錄中移除:
1
|
git log --pretty=oneline --branches -- app /src/main/assets/Android 群英傳.pdf |
重寫所有 commit,將該文件從 Git 歷史中完全移除:
1
|
git filter-branch --index-filter 'git rm --cached --ignore-unmatch app/src/main/assets/Android群英傳.pdf' -- --all |
到這里,歷史記錄中已經(jīng)沒有該文件了。不過運(yùn)行 filter-branch 產(chǎn)生的日志還是會(huì)對該文件有引用,所以還需要運(yùn)行以下幾條命令,把該文件的引用完全刪除:
1
2
3
4
|
rm -Rf .git /refs/original rm -Rf .git /logs/ git gc git prune |
這個(gè)時(shí)候,再看文件夾,已經(jīng)小了很多了。然后就可以 push 代碼了,不過就是需要強(qiáng)制 push:
1
|
git push --force |
以上就是刪除 Git 歷史記錄中大文件的過程。
當(dāng)然 filter-branch 的作用還不止這些,比如它還可以用來修改歷史提交記錄中的用戶名(username)和郵箱(email)等。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對服務(wù)器之家的支持。
原文鏈接:https://blog.laocaixw.cn/2018/06/28/Git_filter_branch/