できない.dev

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 での履歴掃除のどちらかが必要。

よくある原因

  1. 100MB 超を commit してしまった: 動画 / アーカイブ / モデルファイルを誤ってリポジトリに入れた。
  2. 履歴に残っている: 直近で git rm しても、過去コミットに blob が残っているため push 拒否は解消しない。
  3. LFS 未導入: 大ファイルを通常 blob として扱っているため、clone も push も重い。
  4. 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 push

LFS は実体を専用ストレージに置き、Git には参照ポインタだけ入れる仕組み(Git LFS 公式)。
新規ファイル用には最も素直な解。

2. 履歴から完全削除

pip install git-filter-repo
git filter-repo --path big.bin --invert-paths
git push --force-with-lease

GitHub の 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 でサイズを目視確認する習慣も有効。

この記事は役立ちましたか?