其實,git-unpack-objects會很好的工作if你首先重命名或移動pack文件。它旨在將入庫包添加到存儲庫,添加所有尚未存在的對象。只要將包文件移動到git找不到它的文件名就會使其所有對象都不可見。
基本上:
mv .git/objects/pack .git/objects/pack.old
for i in .git/objects/pack.old/pack-*.pack; do
git-unpack-objects < $i && rm $i ${i%pack}idx
done
rmdir .git/objects/pack.old
然而,請注意,一個包的文件比該鬆散物較小多(因爲鬆動物體不做相互Δ-壓縮),並且當最初萊納斯打算做你正在做的事(只有鬆散的對象和使用rsync),他很快發現它是行不通的。
做正確的做法是重新包裝一次(有侵略性的參數,以儘量減少大小),然後創建一個.keep文件(如果$i
是pack-*.pack
,要touch ${i%pack}keep
)。這將使創建的包文件「神聖」,它永遠不會被刪除或重新打包。
然後,您可以在「剩餘」包中使用rsync,直到它變得足夠大以保證綁定到第二個.keep shunk。
第三種方法是使用git-bundle
來創建一個包含自上次備份以來只有deltas的包。
那麼,即使你可以解壓它,我懷疑你可以把它放到與以前完全相同的一組包中。 – 2010-01-12 21:56:13
這是真的 - git偶爾會(當物體數量增長的時候)會自動生成一個包,所以你最終將被迫移動一個新的包。 – 2010-01-12 22:10:21
如果不完全一樣,我很高興。能夠改善事情會很好 – Rory 2010-01-12 22:17:30