重新包装Git存储库失败

时间:2011-01-28 09:30:18

标签: git repository

我有一个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。

7 个答案:

答案 0 :(得分:104)

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

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

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

值得一提的是,在过去重新打包非常大型存储库时遇到malloc失败时,我还更改了core.packedgitwindowsizecore.packedgitlimit,{{的值1}},core.deltacachesizepack.deltacachesizepack.window但听起来好像您不需要任何其他选项:)

答案 1 :(得分:22)

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

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

希望它仍能帮助别人。

答案 2 :(得分:15)

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

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

答案 3 :(得分:5)

这不能回答这个问题,但有人可能会遇到这个问题:当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将一些文件的内容映射到内存中,并且由于内存杀手不够智能,它将mmapped文件计为已用内存,在尝试mmap时杀死Git进程一个大文件。

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

答案 4 :(得分:1)

我正在使用git版本1.7.0.4并且它接受此命令。 git 1.6版可能不接受此命令。

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

答案 5 :(得分:1)

git config --global pack.window 0

答案 6 :(得分:0)

我在私有github.com存储库上使用git 2.1.0在ubuntu 14.10上遇到了同样的问题。 (怀疑是Entreprise路由器!在不同的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克隆(我事先设置了ssh密钥*),如下所示:

  

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

变为:

  

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

* :(生成ssh密钥)

  

ssh-keygen -t rsa -C&#34; your_email_address_registered_with_github@domain.com"

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