bfgの実行でLargeObjectExceptionが発生した場合の対応
bfgを実行した際に以下のエラーが発生した。
Caused by: org.eclipse.jgit.errors.LargeObjectException:【コミットハッシュ】 exceeds size limit at org.eclipse.jgit.internal.storage.file.LargePackedWholeObject.getCachedBytes(LargePackedWholeObject.java:98) at org.eclipse.jgit.treewalk.CanonicalTreeParser.reset(CanonicalTreeParser.java:214) at com.madgag.git.bfg.model.Tree$.entriesFor(Tree.scala:39) at com.madgag.git.bfg.cleaner.ObjectIdCleaner$$anonfun$4.apply(ObjectIdCleaner.scala:119) at com.madgag.git.bfg.cleaner.ObjectIdCleaner$$anonfun$4.apply(ObjectIdCleaner.scala:118) at com.madgag.git.bfg.MemoUtil$$anon$3.load(memo.scala:75) at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3542) at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2323) at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2286) at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2201) ... 107 more
調べてみたところ、GitHubにissueが上がっていた。
org.eclipse.jgit.errors.LargeObjectException · Issue #97 · rtyley/bfg-repo-cleaner · GitHub
その通りに確認していく。
$ git cat-file -t 【コミットハッシュ】 tree
treeオブジェクト形式らしい。
巨大なフォルダ構造だということがわかったので、容量を調べてみる。
$ git cat-file -s 【コミットハッシュ】 10189544
およそ10MBのtreeオブジェクト形式という事がわかった。
bfgが内部的に利用しているJGitのデフォルトは1MBまでとの事なので、今回のエラーが発生した。
以下のオプションを付けて実行することで、扱うことができる最大値を指定できるようなので試してみた。
--massive-non-file-objects-sized-up-to サイズ
こんな感じ。
$ java -jar ./bfg-1.12.14.jar --no-blob-protection --delete-files '*.{jpg,png}' --massive-non-file-objects-sized-up-to 20M
無事処理が完了。
また、OutOfMemoryエラーが発生してしまうことがあるそうなので、その場合はJVMオプションでメモリ割り当てを増やしてあげればよいようだ。
-Xms1G -Xmx4G