2015-01-09 31 views
9

我最近遇到了與我的Bitbucket回購大小限制。我跟着無數其他問題回答瞭如何清理你的git repo,並最終使用BFG刪除了一些不良的提交。如何清理垃圾在遠程git回購

這個效果很好,但是,我注意到在運行git count之後,有大量的空間坐在垃圾中。所以我跑了一個簡單的git gc。但是,這並沒有清理垃圾。

一些挖後,我發現下面的命令:

git -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0 -c gc.rerereresolved=0 \ 
-c gc.rerereunresolved=0 -c gc.pruneExpire=now gc "[email protected]" 

運行這導致了垃圾被清理本地。但是,我仍然有遠程回購的問題。我現在是否需要讓Bitbucket在遠程倉庫上運行此命令,還是有辦法將此更改推送到倉庫?

+2

我不能說bitbucket,但一般來說,裸露的克隆不會保留reflogs;也不會有任何數據。通常你只需要更新遙控器上的ref並在那裏觸發一個gc。 – torek 2015-01-09 19:35:50

回答

7

如果有其他人遇到這種情況,答案證明是肯定的。

到位桶支撐運行以下:

bash-4.1$ git reflog expire --expire="1 hour" --all 
bash-4.1$ git reflog expire --expire-unreachable="1 hour" --all 
bash-4.1$ git prune --expire="1 hour" -v 
bash-4.1$ git gc --aggressive --prune="1 hour" 

之前和從超過2GB後減少遠程回購大小,爲1GB下。

14

我們認爲我們今天有同樣的問題,並能夠解決它沒有聯繫Bitbucket支持,如下所示。請注意,該方法會丟棄最後一次提交的回購 - 因此您可能希望擁有其備份。

Bitbucket報告說,我們的回購約爲2.1GB,而在克隆時,本地只需要約250MB。由此,我們得出結論:它很可能來自無法訪問的提交中的大文件(感謝this answer)。

這是怎麼看的可達當地承諾,在這裏我們不通過引用日誌考慮是否可達

git reflog expire --expire-unreachable="now" --all 
git prune --expire="now" -v 
git gc --aggressive --prune="now" 

git fsck --unreachable --no-reflog

在本地,不可達的提交可以用清洗然而,我們不能在Bitbucket上遠程運行任何這些命令。但是,他們在the page about reducing repo size(部分刪除存儲庫限制)上說他們自己運行git gc,以響應git reset --hard HEAD~1(其中丟棄最後提交)後跟git push -f。此外,他們說在部分垃圾收集死亡數據,你可以嘗試的序列:git reflog expire --expire=now --all,git gc --prune=now,git push --all --force。考慮到這一切,我決定嘗試在本地以下,希望它會切出的引用日誌,做本地剪枝,然後將它們推送到遠程倉庫到位桶上,它會啓動一個GC:

git reflog expire --expire-unreachable="30m" --all 
git prune --expire="30m" -v 
git gc --prune="30m" 
git reset --hard HEAD~1 
git push -f 

這工作,回購大小立即從2.1GB到約。 250MB。:)

請注意,過期/過期 - 不可到達/修剪的時間參數將從現在開始設置過期截止點測量。所以例如「now」意味着過期/修剪所有內容,「30m」意味着除了最近30分鐘內的更改。

+0

'git reset --hard HEAD〜1'和'git push -f'絕招是金塵,謝謝! – Liam 2016-12-20 17:10:15

+1

這是否可以在任何分支上工作,或者您是否必須對主設備進行重置? – 2017-01-03 15:40:47

+0

工作就像一個魅力,謝謝 – 2017-09-01 14:48:38