web-dev-qa-db-ja.com

Gitリポジトリの再パックが失敗する

メモリが限られているサーバーにgitリポジトリがあります。サーバーから既存のリポジトリを複製しようとすると、次のエラーが表示されます

hemi@ubuntu:$ git clone ssh://[email protected]/home/hemi/repos/articles
Initialized empty Git repository in /home/hemi/Skrivebord/articles/.git/
[email protected]'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:$ 

このエラーを処理するために、元のリポジトリを再パックしようとしました( このフォーラム投稿 に従って)。ただし、リポジトリを再パックする代わりに、「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がサーバーにインストールされます。

57
midtiby

ソリューションでは、ローカルおよびリモートで作業用コピーを取得しましたが、リモートリポジトリが再び自分自身を再パックすることを決定すると、問題が再び発生します。幸いなことに、両方のリポジトリでの再パックに必要なメモリ量を削減する設定オプションを設定できます。これにより、基本的に、再パック時にデフォルトオプションに追加したコマンドラインパラメータが作成されます。そのため、リモートにログインし、リポジトリに変更してから実行する必要があります。

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

ローカルリポジトリでも同じことをしたい場合があります。 (ちなみに、あなたのリポジトリは非常に大きいか、これらはメモリの少ないマシンだと思います-これらの値は私には非常に低いようです。)

価値のあることですが、過去にvery大規模なリポジトリをリパックする際にmallocエラーが発生した場合、core.packedgitwindowsizecore.packedgitlimitcore.deltacachesizeの値も変更しました、pack.deltacachesizepack.windowおよびpack.threadsですが、それ以上オプションを必要としないように聞こえます:)

105
Mark Longair

リポジトリに直接アクセスできないため、再パックを実行できないため、浅いクローンを実行し、深さを増やしながら徐々にフェッチしていくと助けになりました。

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

それがまだ誰かを助けることができることを願っています。

22
mmm

次の手順を使用して問題を解決しました。

  1. サーバーからローカルマシンにリポジトリをチェックアウトしました(ssh経由でrawコピーを使用)
  2. ローカルリポジトリを再パックしました
    git repack -a -d --window-memory 10m --max-pack-size 20m
  3. サーバーに空のリポジトリを作成しました
    git init --bare
  4. ローカルリポジトリをサーバーにプッシュしました
  5. サーバーリポジトリを複製できることを確認しました
15
midtiby

これは質問に答えませんが、誰かがそれに出くわす可能性があります。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されたファイルを使用済みメモリとしてカウントし、mmap大きなファイル。

解決策は、mmapサポートをオフにしてカスタムGitバイナリをコンパイルすることです(configure NO_MMAP=1)。

5
zoul

Gitバージョン1.7.0.4を使用していますが、このコマンドを受け入れます。 gitバージョン1.6がこのコマンドを受け入れない可能性があります。

いくつかのランダムなコミットで新しいリポジトリを作成してみてください。次に、このコマンドで再パックします。

1

プライベート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 [email protected]:USERNAME/REPOSITORYNAME.git

*:(sshキーの生成)

ssh-keygen -t rsa -C "[email protected]"

次に、設定でgithubにログインし、sshキーをインポートして、〜/ .ssh/id_rsa.pubからインポートします。

0
arcol