使用git filter-branch
徹底刪除git中的文件(包括歷史提交記錄)
(1)查看存儲庫中的大文件:
git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -15 | awk '{print$1}')"
(2)改寫歷史,去除大文件:
注意:下方命令中的
path/to/large/files
是大文件所在的路徑桑腮,千萬不要弄錯蕾域!
Git這么強大,肯定是存在可以永久刪除歷史記錄的命令到旦,找了一圈,發(fā)現(xiàn)確實有“后悔藥”命令巨缘,那就是git filter-branch添忘,通過以下命令,就可以永久刪除你想要刪除的任何文件若锁,
- 比如:
path/to/large/files
替換成IPADir/Debug/Lhahahahagolf.ipa
4cb60a1eec75fbca3662f6721095c2 IPADir/Debug/Lhahahahagolf.ipa
9f9ec0b483fe8465a818c8f0eb18d6 IPADir/Debug/Lhahahahagolf.ipa
1bf776b4d09e2291b9d6ac8656ea1 Pods/AMapLocation-NO-IDFA/AMapLocationKit.framework/AMapLocationKit
git filter-branch --tree-filter 'rm -f path/to/large/files' --tag-name-filter cat -- --all
將path/to/large/files
替換為刪除文件的相對路徑搁骑,并執(zhí)行,如果有以下執(zhí)行反饋Ref 'refs/heads/master' was rewritten
又固,說明刪除成功了仲器。
如果在 git filter-branch
操作過程中遇到如下提示,需要在 git filter-branch
后面加上參數(shù) -f
(出現(xiàn)這個錯誤的原因是仰冠,第一次操作成功后發(fā)現(xiàn)倉庫大小并沒有減少(可能還增大了)乏冀,便進行了第二次操作)
提示:
Cannot create a new backup.
A previous backup already exists in refs/original/
Force overwriting the backup with -f
// 需要在 `git filter-branch` 后面加上參數(shù) `-f`
git filter-branch -f --tree-filter 'rm -f IPADir/Debug/Lhahahagolf.ipa' --tag-name-filter cat -- --all
并告知所有組員,push 代碼前需要 pull rebase
洋只,而不是 merge
辆沦,否則會從該組員的本地倉庫再次引入到遠程庫中,導致倉庫在此被 Gitee 系統(tǒng)屏蔽识虚。
(3)這樣的刪除并不徹底肢扯,隨時可以恢復文件。
// 但這樣的刪除并不徹底担锤,隨時可以恢復文件蔚晨。
$ git reset refs/original/refs/heads/master --hard
or
$ git reflog&&git checkout $commit-SHA1
(4)因此,需要在步驟(2)git filter-branch之后肛循,繼續(xù)執(zhí)行:
$ git filter-branch -f --tree-filter "rm -f config/test.c" # 個人更使用喜歡參數(shù)為--index-filter,--all filtered all refs铭腕; --tag-name-filter cat 刪除原始tag
<br>#回收內(nèi)存的操作
$ rm .git/refs/original/refs/heads/master # $ rm .git/refs/original 刪除git的備份
$ git reflog expire --all --expire=now #使所有散落的object失效
$ git fsck --unreachable #檢查是否有散落的object, 驗證數(shù)據(jù)庫中對象的連接性和有效性
$ git gc --prune=now #git的垃圾清理車最終刪除那些對象 git gc --aggressive --prune=now , --aggressive 此選項將導致git gc更積極地優(yōu)化存儲庫银择,但代價是花費更多時間。\<br>--prune=<date> Prune loose objects older than date 修剪比日期更早的松散物體谨履』渡悖可以在此之前執(zhí)行 git repack -A -d 在存儲庫中打包解壓縮的對象。 刪除冗余的對象$ git fsck #檢查是否還有對應(yīng)的object笋粟,現(xiàn)在已經(jīng)找不到提交的sha1了
(5)查看文件大小
du -ah .git/objects
(6) 項目根目錄 隱藏文件.git
文件占用存儲空間變小了:(command + shift + .
)點:“.”
執(zhí)行以上命令怀挠,就會發(fā)現(xiàn).git目錄變小了。那么接下來只要把本地的記錄害捕,強制更新到遠程倉庫就行了绿淋。
(7)強制推到倉庫: 提交變動
注意:強制更新是一個非常危險的動作,一定要確保你的本地內(nèi)容是最新的尝盼,已經(jīng)沒有人在你之后提交了代碼吞滞,否則會將其它的人提交的代碼也一并刪除了。
$ git push origin --tags --force
$ git push origin --all --force
# 其中master為你要推送的分支
// git push origin master --force