在git多分支repo倉庫中徹底清除大檔案

2021-09-26 07:53:58 字數 3024 閱讀 7090

坑的由來

repo中不小心上傳了許多測試生成的data。結果可想而知,原本只有**的倉庫突然間變得無比臃腫(或者是慢慢臃腫),從早期的幾十mb,迅速飆公升至1g.

早些時候我對git的原理並不是很了解,只是隨著日常使用,終於開始理解git其實是乙個指標指向一次提交的物件,當你在各個分支間切換的時候,指標就隨之切換,版本也隨之更改。

那麼,git 是如何做到的能在各個版本間無縫切換的呢。即使long long ago的**,只要來一句git reset --hard sesd54f54sdf5sd4sd5f照樣給你打回原形。

在相應的git資料夾裡面 按下面組合鍵 可以看到隱藏的.git版本控制檔案

真相只有乙個,那就是其實所有的版本,不管是否存在了多久,都仍然存在於硬碟裡。所以你才可以任性地對**為所欲為。然而,為所欲為也要付出代價。

size-pack以千位元組為單位表示,那麼這裡就有0.3g大小,這對**倉庫來說可是個恐怖的數字了。

那麼讓我們來找出罪魁禍首——到底是哪些大檔案在混淆視聽。

將所有含這些大檔案的歷史提交記錄,乙個不漏的找出來。

tail -30 表示 列舉前30項

然後移除對該檔案的引用 也就是 (tests_run_one.....後面一長串)  (使用filter-branch去除大檔案)

git filter-branch --force --index-filter "

git rm --cached --ignore-unmatch 'tests_run_one.....後面一長串'

" --prune-empty --tag-name-filter cat -- --all

進行repack

git for-each-ref --format='

delete %(refname)

' refs/original | git update-ref --stdin

# 指示git清除不需要的資料:

git reflog expire --expire=now --all && git gc --prune=now --aggressive

檢視pack的空間使用情況 

git count-objects -v
檢視.git的實際大小

du -sh .git
強制把本地的分支(這裡是master)更改推送到git伺服器分支

git push origin  --force --all
引數 origin 是遠端倉庫位址別名, 具體請參照 git remote -v 命令 檢視選擇

引數 --force 是強制推送, 這個引數表示強行覆蓋遠端倉庫, 這個引數跟tnt一樣危險不能亂用, 它可以簡寫為 -f

引數 --all 表示所有歷史都要覆寫, 當然我不知道這裡的 「全部」 是多少, 教程裡還提到了再提交一次 tags 的

強制push tags

git push origin  --force --tags

git push --force --verbose --dry-run

git push --force

rm -rf .git/refs/original/git reflog expire --expire=now --all

git fsck --full --unreachable

git repack -a -d

git gc --aggressive --prune=now

git push --force

到此,大檔案已經從倉庫中清除了,重新拉乙個倉庫,速度變快了,可以看到倉庫的體積已經變小了,注意:一定要重新拉取倉庫。當repo只有預設的master的時候 以上是可以完成需求的實驗證明 如果repo 有其他分支(除了master分支之外) 以上指令沒有效果 也就是遠端端 並沒有減少庫容量 因為分支沒有得到push 實際上--all引數是失效的

首先建立本地

git branch -r

git checkout -b tests origin/tests //檢出遠端的tests分支到本地tests

git branch

git for-each-ref --format='

delete %(refname)

' refs/original | git update-ref --stdin

git reflog expire --expire=now --all && git gc --prune=now --aggressive

git push origin tests:tests --force //推送本地的tests(冒號前面的)分支到遠端origin的tests(冒號後面的)分支(沒有會自動建立)
本文參考

repo管理git倉庫 回退版本

1.repo回退所有git倉庫到指定日期之前 repo forall c commitid git log before 2019 01 01 07 00 1 pretty format h git reset hard commitid 2.repo回退到某tag 先去隨意git倉庫下,git t...

git多人協作 和 多分支

1 建立組織 2 在組織下建立團隊 開發團隊,測試團隊等等 3 在組織下建立人員 4 在組織下建立倉庫 5 把團隊和人員進行對應 6 把團隊和倉庫進行對應 分支就是乙個倉庫的子庫 git倉庫裡分為如下分支 開發庫個人庫1 個人庫2 測試庫發布庫1 建立分支 git branch 分支名 2 切換分支...

git多分支合併時的坑

有兩個分支,master和基於master建立的dev分支 master分支對檔案a執行了移動路徑的操作 rename dev分支也對檔案a執行了相同的移動路徑的操作 rename 現在,想要把dev分支合併回master分支,檔案a會不會衝突?合併結果 實際測試一下,發現不會衝突,因為兩邊相對位置...