【问题标题】:Repack of Git repository fails重新打包 Git 存储库失败
【发布时间】:2011-01-28 09:30:18
【问题描述】:

我有一个 git 存储库驻留在内存有限的服务器上。 当我尝试从服务器克隆现有存储库时,出现以下错误

hemi@ubuntu:$ git clone ssh://hemi@servername.dk/home/hemi/repos/articles
Initialized empty Git repository in /home/hemi/Skrivebord/articles/.git/
hemi@servername.dk's password: 
remote: Counting objects: 666, done.
remote: warning: suboptimal pack - out of memory
remote: fatal: Out of memory, malloc failed
error: git upload-pack: git-pack-objects died with error.
fatal: git upload-pack: aborting due to possible repository corruption on the remote side.
remote: aborting due to possible repository corruption on the remote side.
fatal: early EOF
fatal: index-pack failed
hemi@ubuntu:$ 

为了处理这个错误,我尝试重新打包原始存储库(根据this forum post)。但它没有重新打包存储库,而是描述了如何使用“git pack-objects”命令。

hemi@servername:~/repos/articles$ git repack -a -d --window-memory 10m --max-pack-size 100m
usage: git pack-objects [{ -q | --progress | --all-progress }]
        [--all-progress-implied]
        [--max-pack-size=N] [--local] [--incremental]
        [--window=N] [--window-memory=N] [--depth=N]
        [--no-reuse-delta] [--no-reuse-object] [--delta-base-offset]
        [--threads=N] [--non-empty] [--revs [--unpacked | --all]*]
        [--reflog] [--stdout | base-name] [--include-tag]
        [--keep-unreachable | --unpack-unreachable 
        [<ref-list | <object-list]

Git 1.6.5.7 已安装在服务器上。

【问题讨论】:

    标签: git repository


    【解决方案1】:

    您的解决方案在本地和远程为您提供了一个工作副本,但是当远程存储库决定再次重新打包时会再次导致问题。幸运的是,您可以设置配置选项,以减少在两个存储库中重新打包所需的内存量——这些实质上使您在重新打包时添加到默认选项中的命令行参数。因此,您应该登录到远程,更改到存储库并执行以下操作:

    git config pack.windowMemory 10m
    git config pack.packSizeLimit 20m
    

    您可能希望在本地存储库上执行相同的操作。 (顺便说一句,我猜你的存储库非常大,或者这些机器内存很少 - 这些值对我来说似乎很低。)

    不管怎样,过去在重新打包 very 个大型存储库时遇到 malloc 失败时,我还更改了 core.packedgitwindowsizecore.packedgitlimitcore.deltacachesize、@987654325 的值@、pack.windowpack.threads 但听起来好像您不需要任何其他选项:)

    【讨论】:

    • 感谢您的配置选项,我以前不知道它们。该存储库包含大量 pdf 文件。存储库的总大小(包括 .git 目录和跟踪的文件)约为 1.1 GB。所以我猜这是一个大型存储库;-)
    • @MarkLongair:先生,您救了我的命!我正要跑去商店买一些 RAM 升级:D
    • 特别是在 Dreamhost 我不得不使用 pack.windowMemory 10m pack.packSizeLimit 20m pack.deltacachesize = 20m pack.threads = 2 和 core.deltacachesize = 20m core.packedgitlimit = 30m 。谢谢@MarkLongair
    【解决方案2】:

    由于无法直接访问存储库,因此无法执行重新打包,执行浅克隆,然后在增加深度的同时逐渐获取对我有帮助。

    git clone YOUR_REPO --depth=1
    git fetch --depth=10
    ...
    git fetch --depth=100
    git fetch --unshallow    //Downloads all history allowing to push from repo
    

    希望它仍然可以帮助某人。

    【讨论】:

    • 作为大量工作的最后手段,这确实有效。谢谢。
    • git clone REPO --depth=1 对我来说仍然失败,错误为remote: aborting due to possible repository corruption on the remote side.
    • 有点石器时代的方法,但哦,它有帮助,我发现由于某种原因我能做到的最大深度是 300...
    【解决方案3】:

    我使用以下步骤解决了问题。

    1. 已将存储库从服务器签出到我的本地计算机(使用 ssh 上的原始副本)
    2. 重新打包本地仓库
      git repack -a -d --window-memory 10m --max-pack-size 20m
    3. 在服务器上创建了一个空存储库
      git init --bare
    4. 将本地存储库推送到服务器
    5. 检查是否可以克隆服务器存储库

    【讨论】:

    • 我很高兴听到您已将其排序,但我应该警告您,当服务器决定重新打包其存储库时,您将再次遇到同样的问题。最好在远程存储库中设置配置选项(例如,如我的回答中所建议的那样),这样当它自动重新打包时,您仍然不会耗尽内存。
    【解决方案4】:

    这不能回答问题,但有人可能会遇到它:当pack-objects 被某种内存杀手(例如 Dreamhost 上使用的那个)终止时,服务器上的重新打包也可能失败:

    $ git clone project-url project-folder
    Cloning into project-folder...
    remote: Counting objects: 6606, done.
    remote: Compressing objects: 100% (2903/2903), done.
    error: pack-objects died of signal 9284.51 MiB | 2.15 MiB/s   
    error: git upload-pack: git-pack-objects died with error.
    fatal: git upload-pack: aborting due to possible repository corruption on the remote side.
    remote: aborting due to possible repository corruption on the remote side.
    fatal: early EOF
    fatal: index-pack failed
    

    在 Dreamhost 上,这似乎是由 mmap 引起的。重新打包代码使用mmap 将一些文件的内容映射到内存中,并且由于内存杀手不够聪明,它会将映射的文件视为已用内存,当它尝试mmap 一个大文件时会杀死Git 进程。

    解决方案是编译一个自定义 Git 二进制文件,关闭 mmap 支持 (configure NO_MMAP=1)。

    【讨论】:

    • 您知道是否可以将 NO_MMAP=1 选项添加到现有的 git install 中?
    • 我不这么认为,它看起来像一个预处理器宏,会导致生成不同的代码。但这只是一个观点,我没有研究它。
    【解决方案5】:

    我使用的是 git 版本 1.7.0.4,它接受这个命令。 git 1.6 版可能不接受这个命令。

    尝试使用一些随机提交创建一个新存储库。然后用这个命令重新打包。

    【讨论】:

    • 你说的是这个命令吗? git repack -a -d --window-memory 10m --max-pack-size 100m
    【解决方案6】:

    git config --global pack.window 0

    【讨论】:

      【解决方案7】:

      我在 ubuntu 14.10 上使用 git 2.1.0 在私有 github.com 存储库上遇到了同样的问题。 (怀疑是企业路由器!工作在不同的wifi网络,工作场所除外)

      * GnuTLS recv error (-54): Error in the pull function.
      * Closing connection 2jects:  31% (183/589)   
      error: RPC failed; result=56, HTTP code = 200
      fatal: The remote end hung up unexpectedly
      fatal: protocol error: bad pack header
      

      我的解决方案是,使用 ssh 进行 git clone(我事先设置了 ssh 密钥*),如下所示:

      git 克隆https://github.com/USERNAME/REPOSITORYNAME.git

      变成:

      git clone git@github.com:USERNAME/REPOSITORYNAME.git

      *:(生成 ssh 密钥)

      ssh-keygen -t rsa -C "your_email_address_registered_with_github@domain.com"

      然后登录 github,在设置中,导入 ssh 密钥,然后从 ~/.ssh/id_rsa.pub 导入。

      【讨论】:

      • 我听说企业路由器会为 HTTP 进行内容扫描和断开连接,但从不使用 HTTPS - 你的路由器是否也对 HTTPS 流量进行解码和重新加密?
      • Rup:在上网之前涉及两个路由器。下周,我将确切检查该特定公司的设置情况。我验证了,因为它在其他任何地方(任何其他 wifi 网络)都没有失败,只是在那个特定的公司。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-11
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 2019-05-25
      • 1970-01-01
      相关资源
      最近更新 更多