Git で大きなファイル(100MB 超)が push できない
GitHub は単一ファイル 100MB を上限としており、超えた blob は push が拒否される。
履歴に紛れたまま push が通らなくなるので、Git LFS に乗せるか filter-repo で履歴から削除する。
#push#large-file#lfs#github#size-limit
要約
remote: error: File ... is 123.45 MB; this exceeds GitHub's file size limit of 100.00 MB は、GitHub の 単一ファイル 100MB 上限 に当たった状態。
最新コミットから消すだけでは履歴に blob が残っているため push できない。
Git LFS への移行か、git filter-repo での履歴掃除のどちらかが必要。
よくある原因
- 100MB 超を commit してしまった: 動画 / アーカイブ / モデルファイルを誤ってリポジトリに入れた。
- 履歴に残っている: 直近で
git rmしても、過去コミットに blob が残っているため push 拒否は解消しない。 - LFS 未導入: 大ファイルを通常 blob として扱っているため、clone も push も重い。
- build 成果物の混入:
distや*.tar.gzが.gitignoreに追加される前に commit されている。
解決策
1. Git LFS に乗せる
git lfs install
git lfs track "*.psd"
git add .gitattributes
git add path/to/big.psd
git commit -m "track psd via LFS"
git pushLFS は実体を専用ストレージに置き、Git には参照ポインタだけ入れる仕組み(Git LFS 公式)。
新規ファイル用には最も素直な解。
2. 履歴から完全削除
pip install git-filter-repo
git filter-repo --path big.bin --invert-paths
git push --force-with-leaseGitHub の Managing large files ドキュメント のとおり、過去コミットの blob は履歴を書き換えないと消えない。
force push は共同作業者と必ず調整する。
3. 別ストレージに移す
ビルド成果物 → GitHub Releases / Actions の Artifacts
データセット → S3 / Cloud Storage / Hugging Face
バイナリ依存 → パッケージレジストリ長期保管はリポジトリ外に逃がし、リポジトリには取得スクリプトだけ残す。
clone 速度も改善する。
4. 再発防止
node_modules/
dist/
*.zip
*.mp4
*.psd.gitignore で先に弾いておく。
commit 前に git diff --cached --stat でサイズを目視確認する習慣も有効。