git-如何撤消一个";git重新包装-广告;?

git-如何撤消一个";git重新包装-广告;?,git,version-control,Git,Version Control,我有一个git存储库,我用它打包了git repack-a-d,它将所有对象重新打包到一个大文件中。这样可以节省空间。但是我想撤销它,把一个大的包文件变成所有的小对象文件 我想这样做的原因是将git存储库备份到远程服务器。我做了备份(在重新打包之前)。在远程服务器上安装git是非常重要的,所以我打算使用rsync来复制文件。然而,rsync并没有这么聪明,它基本上希望再次复制东西。如果我可以“解包”此存储库,可能会加快复制速度。将解包对象,但仅在不包含包的repo中解包: 进行新的空回购: mk

我有一个git存储库,我用它打包了
git repack-a-d
,它将所有对象重新打包到一个大文件中。这样可以节省空间。但是我想撤销它,把一个大的包文件变成所有的小对象文件

我想这样做的原因是将git存储库备份到远程服务器。我做了备份(在重新打包之前)。在远程服务器上安装git是非常重要的,所以我打算使用
rsync
来复制文件。然而,rsync并没有这么聪明,它基本上希望再次复制东西。如果我可以“解包”此存储库,可能会加快复制速度。

将解包对象,但仅在不包含包的repo中解包:

进行新的空回购:

mkdir new-repo; cd new-repo; git init
将对象写入:

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

或者,如果您喜欢冒险,您可以尝试使用
new repo
中的objects目录替换旧目录。

实际上,如果您首先重命名或移动包文件,git unpack对象就可以正常工作。它的设计目的是将传入包添加到存储库中,添加尚未存在的所有对象。只需将包文件移动到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
mv.git/objects/pack.git/objects/pack.old
对于i in.git/objects/pack.old/pack-*.pack;做
git解包对象<$i&&rm$i${i%pack}idx
完成
rmdir.git/objects/pack.old
但是,请注意,包文件比松散对象小得多(因为松散对象彼此之间不进行增量压缩),虽然Linus最初打算完全执行您正在执行的操作(仅松散对象并使用rsync),但他很快发现这是不可行的

正确的方法是重新打包一次(使用积极的参数来最小化大小),然后创建一个.keep文件(如果
$i
pack-*.pack
,则要
触摸${i%pack}keep
)。这将使创建的包文件“神圣”,并且它永远不会被删除或重新打包

然后你可以在“剩菜”包上使用rsync,直到它变得足够大,可以打包成一秒钟

第三种方法是使用
git bundle
制作一个包,其中只包含自上次备份以来的增量。

您可以尝试

fast-export | fast-import
新的回购协议。很可能不会触发打包。
否则你可以调整pack的配置(
mangit-config
,search-for-pack.*)

好吧,即使你可以解包,我怀疑你是否能像以前一样将其放入完全相同的包/对象集中。这是真的-git偶尔会(当对象数量增加时)自动生成一个包,所以你最终会被迫搬走一个新的包。如果不是完全一样,我很高兴。能够改善情况会很好
fast-export | fast-import