坑的由來
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 "進行repackgit rm --cached --ignore-unmatch 'tests_run_one.....後面一長串'
" --prune-empty --tag-name-filter cat -- --all
git for-each-ref --format='檢視pack的空間使用情況delete %(refname)
' refs/original | git update-ref --stdin
# 指示git清除不需要的資料:
git reflog expire --expire=now --all && git gc --prune=now --aggressive
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到此,大檔案已經從倉庫中清除了,重新拉乙個倉庫,速度變快了,可以看到倉庫的體積已經變小了,注意:一定要重新拉取倉庫。當repo只有預設的master的時候 以上是可以完成需求的實驗證明 如果repo 有其他分支(除了master分支之外) 以上指令沒有效果 也就是遠端端 並沒有減少庫容量 因為分支沒有得到push 實際上--all引數是失效的git fsck --full --unreachable
git repack -a -d
git gc --aggressive --prune=now
git push --force
首先建立本地
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會不會衝突?合併結果 實際測試一下,發現不會衝突,因為兩邊相對位置...