2010-01-12 97 views
3

我有一個git倉庫,我已經與git repack -a -d包裝,這個重新打包所有的對象成一個大文件。這節省了空間。不過,我想撤銷這一點,並將一個大包文件轉換爲所有小對象文件。git - 如何撤消「git repack -ad」?

我想這樣做的原因是將git存儲庫備份到遠程服務器。我做了一個備份(重新打包之前)。在遠程服務器上安裝git並不重要,所以我打算使用rsync來複制文件。然而,rsync不是這個聰明的,基本上想要複製的東西。如果我可以「解開」這個存儲庫,它可能會使它更快地複製。

+1

那麼,即使你可以解壓它,我懷疑你可以把它放到與以前完全相同的一組包中。 – 2010-01-12 21:56:13

+0

這是真的 - git偶爾會(當物體數量增長的時候)會自動生成一個包,所以你最終將被迫移動一個新的包。 – 2010-01-12 22:10:21

+0

如果不完全一樣,我很高興。能夠改善事情會很好 – Rory 2010-01-12 22:17:30

回答

5

git-unpack-objects將解包的對象,但只回購該沒有內部包含包:

建立一個新的,空的回購協議:

mkdir new-repo; cd new-repo; git init 

寫對象:

git unpack-objects < ../old-repo/.git/objects/pack/pack-XXX.pack 

拉必要的分支/標籤:

git pull ../old-repo 

或者,如果您喜歡冒險,則可以嘗試使用new-repo中的對象目錄作爲舊的替代。

4

其實,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文件(如果$ipack-*.pack,要touch ${i%pack}keep)。這將使創建的包文件「神聖」,它永遠不會被刪除或重新打包。

然後,您可以在「剩餘」包中使用rsync,直到它變得足夠大以保證綁定到第二個.keep shunk。

第三種方法是使用git-bundle來創建一個包含自上次備份以來只有deltas的包。

1

你可以嘗試做一個

fast-export | fast-import 

到一個新的回購協議。有可能沒有包裝會被觸發。 否則,你可以調整包的配置(man git config,搜索包*)