web-dev-qa-db-ja.com

過剰なメモリを使用しているGitgc、完了できません

最終的な更新と修正:ここでの解決策は、CygwinGitではなくWindowsGitを使用するという2つの組み合わせであることが判明しました。 as Graham Borlandsuggested 、およびGit構成設定pack.threads = 1およびgc.aggressiveWindow = 150

大規模なローカルGitリポジトリ、約40,000コミットのSVNリポジトリのgit svn cloneがあります。このリポジトリでgit gcを実行しようとしていますが、どこにも行きません。

$ git gc --auto
Auto packing the repository for optimum performance. You may also
run "git gc" manually. See "git help gc" for more information.
Counting objects: 25966, done.
Compressing objects: 100% (25249/25249), done.
fatal: Out of memory, malloc failed (tried to allocate 426523986 bytes)
error: failed to run repack

Cygwin内で4GBRAMを搭載した64ビットデュアルコアWin7マシンでGit1.7.5.1を実行しています。 .gitディレクトリは現在6.1GB強です。

git gc --aggressiveを実行して、より完全なシステムで修正できるかどうかを確認しましたが、うまくいきません。同じサイズのmallocを試行しても、上記と同様のメッセージが表示されますが、かなり多いオブジェクト数(508,485カウント、493,506圧縮)。

また、Googleが提案しているように、[pack]ファイルの.gitconfig部分にさまざまな調整を試みました。最も完全なものは 別のStackOverflowの質問 からです。私の.gitconfigには次の関連行がありますが、これらを設定しても違いはないようです。

[pack]
        windowMemory = 16m
        threads = 1
        window = 1
        depth = 1
        deltaCacheSize = 1

リポジトリをgitからgcに取得する方法について何か提案はありますか?

編集Mark Longair推奨 さらに.gitconfigファイルの変更。私が作った、以下の新しい行。しかし、変更は何の違いもありませんでした。

[core]
        packedGitWindowSize = 1m
        packedGitLimit = 256m
[pack]
        packSizeLimit = 128m

編集2Michael Krelin推奨 スワップ/ページファイルサイズを増やす(WinXP命令- ここ 、Win7でも同様です)。私はそれを試しましたが、違いはありませんでした。実際、使用可能な最大サイズを増やすだけで、Windowsが使用しているページファイルのサイズを決して増やそうとしなかったように見えます。

私は今、これがCygwin内のメモリ制限によるものなのか、Cygwinに課せられたものなのかを調べています。 「課せられた」をチェックするために、管理者権限でCygwinを実行しようとしています。 「内」(より可能性が高いように見える)をチェックするために、私は Cygwinの最大メモリ設定 で遊んでいます。

編集3:Cygwinの使用を好むかもしれませんが、WindowsGitクライアントはメモリの問題をうまく処理していることがわかりました。リポジトリを整理する必要があるときは、頻繁にそれにフォールバックするようです。

35
me_and

Cygwin内で実行するよりも、 msysGit などのネイティブWindowsクライアントを実行する方が運が良い場合があります。

7
Graham Borland

私は同じ問題を抱えていましたが、これまでに述べた解決策を試しましたが成功しませんでした。しかし、大きな画像ファイルをリポジトリに追加した後にgit gcの問題が発生したため、.gitattributesファイルを作成し、それらの大きなファイルのデルタ圧縮をオフにしました。

*.tga -delta
*.psd -delta

機能した。

11
andriej

デフォルト値よりも低い値に制限してみてください。その他の構成オプションには、次のものがあります。

  • pack.packSizeLimit
  • core.packedGitWindowSize
  • core.packedGitLimit

...これらはすべて git configドキュメント 。私が過去に間違えた、どのユニットが理解されているかをそれぞれの場合にチェックすることは特に価値があります。

5
Mark Longair

共有Linuxホスティングでこのエラーを回避するのに役立つ唯一のことは、追加することでした

  [pack]
    packSizeLimit = 64m
    threads = 1

.gitconfig

最も重要なのは「スレッド= 1」でした

3
Alex

たぶん、一時的に実物よりも大きなスワップファイルを追加し、他の場所で数杯のコーヒーを飲むと役立つでしょうか?