Repack do repository Git falha

Eu tenho um repository git residindo em um servidor com memory limitada. Quando tento clonar um repository existente do servidor, recebo o seguinte erro

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:$ 

Para lidar com esse erro, tentei empacotar o repository original (de acordo com este post do fórum ). Mas em vez de reembalar o repository, ele descreve como usar o comando “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] 

O Git 1.6.5.7 está instalado no servidor.

Sua solução obtém uma cópia de trabalho local e remotamente, mas causará problemas novamente quando o repository remoto decidir se reempacotar novamente. Felizmente, você pode definir opções de configuração que reduzirão a quantidade de memory necessária para o empacotamento em ambos os repositorys – essencialmente, os parâmetros da linha de comando adicionados às opções padrão durante o reempacotamento. Portanto, você deve efetuar login no remoto, mudar para o repository e fazer:

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

Você pode querer fazer o mesmo em seu repository local. (Aliás, acho que o seu repository é muito grande ou são máquinas com pouca memory – esses valores parecem muito baixos para mim.)

Por que vale a pena, ao obter falhas malloc em reembalar repositorys muito grandes no passado, eu também mudei os valores de core.packedgitwindowsize , core.packedgitlimit , core.deltacachesize , pack.deltacachesize , pack.window e pack.threads mas soa como se você não precisasse de mais opções 🙂

Sem access direto ao repository e, portanto, sendo incapaz de realizar um reempacotamento, a execução de um clone superficial e, em seguida, a busca gradual, ao mesmo tempo em que aumentava a profundidade, ajudou-me.

 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 

Espero que ainda possa ajudar alguém.

Eu resolvi o problema usando os seguintes passos.

  1. Recebi o repository do servidor para a minha máquina local (usando uma cópia bruta sobre o ssh)
  2. Reembalou o repository local
    git repack -a -d --window-memory 10m --max-pack-size 20m
  3. Criado um repository vazio no servidor
    git init --bare
  4. Empurrou o repository local para o servidor
  5. Verificado que é possível clonar o repository do servidor

Isso não responde à pergunta, mas alguém pode se deparar com isso: o reempacotamento também pode falhar no servidor quando pack-objects são finalizados por algum tipo de matador de memory (como o usado no 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 

No Dreamhost isso parece ser causado pelo mmap . O código do repack usa o mmap para mapear o conteúdo de alguns arquivos na memory, e como o killer da memory não é inteligente o suficiente, ele conta os arquivos mmap como memory usada, matando o processo do Git quando tenta mmap um arquivo grande.

A solução é compilar um binário Git personalizado com o suporte a mmap desativado ( configure NO_MMAP=1 ).

Eu estou usando o git versão 1.7.0.4 e ele aceita este comando. É possível que o git versão 1.6 não aceite este comando.

Tente criar um novo repository com alguns commits randoms. Em seguida, reembale-o com este comando.

Eu tive o mesmo problema no Ubuntu 14.10 com o git 2.1.0 em um repository privado do github.com. (Roubo Entreprise é suspeito! Funciona em rede wi-fi diferente, exceto no local de trabalho)

 * 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 

Minha solução foi, para o git clone usando o ssh (eu configurei as chaves ssh * antecipadamente), assim:

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

torna-se:

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

*: (Gerando uma chave ssh)

ssh-keygen -t rsa -C “your_email_address_registered_with_github@domain.com”

Então entre no github, nas configurações, importe as chaves ssh e importe-o de ~ / .ssh / id_rsa.pub.