余り一般的な使い方ではないが、Git をバックアップ代わりに使っている。そこで、実際のファイル置き場を USB HDD にしようと思い、
- ~/.git/ を USB HDD にコピー
- ~/.git/ は一旦別名に変更
- ~/.git は、USB HDD へのコピー先へのシンボリック・リンクにする
- 元々作業していたデスクトップからは、問題なく git 〜 が行えることを確認
- サブで使い始めたノート 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^)/
ただ、変更したどのオプションも何を意味するのかよく解っていない(^_^;;。
どこかにこれらオプションの詳細を説明したサイトはないかな?