代码之家  ›  专栏  ›  技术社区  ›  Amandasaurus

Git-如何撤销“Git重新打包-广告”?

  •  3
  • Amandasaurus  · 技术社区  · 15 年前

    我有一个已经打包好的Git存储库 git repack -a -d 将所有对象重新打包成一个大文件。这样可以节省空间。不过,我想撤销这个操作,把一个大包文件转换成所有的小对象文件。

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

    3 回复  |  直到 13 年前
        1
  •  5
  •   Josh Lee ZZ Coder    15 年前

    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 作为旧的替代品。

        2
  •  4
  •   Greg Bacon    13 年前

    实际上,Git解包对象会很好地工作 如果 首先重命名或移动包文件。它的设计目的是将传入包添加到存储库中,并添加所有尚未存在的对象。只需将包文件移动到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
    

    但是,请注意,pack文件是 许多的 比松散对象小(因为松散对象不会对彼此进行增量压缩),而Linus最初打算完全执行您正在执行的操作(仅松散对象并使用rsync),但他很快发现这是不可行的。

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

    然后你可以在“剩余”包上使用rsync,直到它变得足够大,足以保证捆绑成第二个。请保持回避。

    第三种方法是使用 git-bundle 制作一个只包含上次备份后的增量的包。

        3
  •  1
  •   sehe    13 年前

    你可以试着做一个

    fast-export | fast-import
    

    重新回购。很可能不会触发打包。 否则,您可以调整pack的配置( man git config ,搜索包。*)