2017-09-14 50 views
2

我隨着時間的推移在refs/builds/archived/*中歸檔了一堆構建標記,現在我想刪除它們以恢復一些空間並減少總對象數(超過50k註釋的git標記存儲在那裏)。在git中,我如何有效地刪除所有匹配模式的refs?

這樣看來,要做到這一點的唯一方法是,像這樣:

git show-ref\ 
| awk '/refs\/builds\/archived\/[^\/]*$/ { print "git update-ref -d "$2}'\ 
| sh 

這是極其緩慢。此外,這樣做似乎會減慢從回購完成的任何git提取,直到我運行git gc就可以了。

+1

從'git for-each-ref'開始而不是'git show-ref';這將在單個命令中爲您提供一組ref。不幸的是,批量刪除仍然會變得很慢:'git update-ref -d'只能一次處理一個。你可以使用xargs('-n 1')或者像在你自己的代碼sh中那樣調用'git update-ref'。 – torek

+1

'git update-ref'需要一個'--stdin'標誌,讓你傳遞多個指令給它。 –

+0

@KevinBallard:哦,很好,我從來沒有考慮過'--stdin'方法。這對一些系統應該有很大的幫助。 – torek

回答

5

您應該可以這樣說

git for-each-ref --format='delete %(refname)' refs/builds/archived | git update-ref --stdin 

這應該做整個事情在一個批量操作。請注意,我自己並沒有真正嘗試過。

+0

我會在週末試試這個,然後回來......我喜歡這個解決方案的「保持在git之內」。 –

+1

它工作。太驚人了。也許這是因爲缺乏參考資料.. –