Git ではまった

余り一般的な使い方ではないが、Git をバックアップ代わりに使っている。そこで、実際のファイル置き場を USB HDD にしようと思い、

  1. ~/.git/ を USB HDD にコピー
  2. ~/.git/ は一旦別名に変更
  3. ~/.git は、USB HDD へのコピー先へのシンボリック・リンクにする
  4. 元々作業していたデスクトップからは、問題なく git 〜 が行えることを確認
  5. サブで使い始めたノート PC からも同様に行えるかどうか試みるも上手くいかない???

.gitattributes, .gitconfig, .gitignore などを始め git の対称としているファイル/ディレクトリは元々の PC とサブ PC で同期させているのに上手くいかない。(次の結果は、一部伏せ字 XXX に加工している)

$ git status -s error: Out of memory, malloc failed (tried to allocate 33361494017 bytes) error: failed to read object a1ed45301df752c17d8fdc11f129ad058b4949c2 at offset 44549284 from /XXX/.git/objects/pack/pack-e7db9fc2760eff2b328515c4b8f0de219afd25d4.pack fatal: packed object a1ed45301df752c17d8fdc11f129ad058b4949c2 (stored in /XXX/.git/objects/pack/pack-e7db9fc2760eff2b328515c4b8f0de219afd25d4.pack) is corrupt

ネットで見てみると、error: Out of memory, というエラーは、メモリの大きめに取る設定にしたり、使用スレッドを制限する設定を使うと良いとのことなので、

$ git config --global pack.windowMemory 1g $ git config --global pack.threads 2

直接ファイルを編集するなら、~/.gitconfig に

[pack] windowMemory = 1g threads = 2

とするものの上手くいかない。

ファイル構成がほぼ同じなのになぜなんだ???

しかし、この調べる過程で、パックファイルの上限が制限できることを知る。「そういえば問題となっているファイルは、ファイルは馬鹿でかいし、サブ PC のほうがマシン・パワーが劣っている」ということで、この設定を試してみたら上手くいった。

$ git config --global core.packedGitLimit 1g $ git config --global core.packedGitWindowSize 1g $ git config --global pack.packSizeLimit 4g

~/.gitconfig に直接記述するなら、次の通り。

[core] packedGitLimit = 1g packedGitWindowSize = 1g [pack] packSizeLimit = 4g

設定を変えたら、元々の PC でパックファイルを小分けにする。

$ git gc --aggressive --prune=now

これでサブの PC でも Git で処理が可能になった\(^o^)/

ただ、変更したどのオプションも何を意味するのかよく解っていない(^_^;;

どこかにこれらオプションの詳細を説明したサイトはないかな?