5
4

More than 3 years have passed since last update.

[Git] サイズのでかいファイルをコミットして github にpushできなくなった人が読むと幸せになれるかもしれない記事

Last updated at Posted at 2021-02-16

はじめに

gitは差分を管理したりするのに便利な一方で最初に一気にプログラムを書き上げてからfirst commitする人も結構いると思います。
このときに面倒なのが git add です。

横着して git add . とかすると意図しないファイルを巻き込んでいることがあります。
例えば機械学習をされている方でしたら、機械学習のモデルのファイルとかです。

本来であれば最強のオリジナル .gitignore を作れば解決することが多いですが、うっかりやらかしてしまうことがあるとおもいます。
そしてそれに気づいたとき、既に大量にコミットをしていて死にたくなることがあると思います。

そういう時に事故は起こるわけです。

push できない!

githubでは1ファイルあたりの制限があり、100MB以上のファイルをpushすることができません。
じゃあそのファイルを .gitignore に追加すればええか!となるのですが、あとから追加しても時既に遅し、.gitignore に追加して追跡対象外にした、つまり「ファイルを削除した」という履歴が残ってしまいます。
そのため git 上の歴史では あるでかいサイズのファイルが存在して、そして消えていった と残されることになり、結果としてでかいファイルの生きた証がでかいファイルサイズのまま残っているため、今は実際にそのファイルがなくても以下のようなエラーが出ます。

remote: error: GH001: Large files detected. You may want to try Git Large File Storage — https://git-lfs.github.com.

直前のコミットででかいファイルを追加しただけなら、そのコミットをなかったことにして .gitignore に追加してコミットしなおせば良いだけですが、first commitとかでやらかしているとそうはいきません。

歴史からでかいファイルの生きた証を抹消する

というわけでgitの歴史からでかいファイルの存在を抹消すればよいわけです。

% git filter-branch -f --index-filter "git rm -rf --cached --ignore-unmatch [歴史から抹消したいファイル名]" --prune-empty HEAD

HEAD の部分を --all にすると全ブランチを対象に同じ操作が行えるらしいです。

ただしこの方法を取るとそのファイルが存在したコミットから先の歴史がすべて改変されることになるためハッシュが変わります。
そのため、もし既に何らかの方法でgithub等にpushされていた場合、そのままpushできないのでgit push -f とかしないといけません。(通常ならでかいファイルはgithub上に存在し得ないですが、何らかの理由でファイルサイズが増大して100MBを一時的にでも超えると起こりうる)

おそらくこれでpushできるようになるはずです。.gitignore にでかいファイルを対象外に設定しておくことを忘れずに。

終わりに

  • でかいファイルはgit-lfsを使ったりとか、driveなりdropboxからダウンロードするようにしましょう
  • でかいファイルをaddしないようにしましょう
  • でかいファイルは .gitignore で無視するようにしましょう
  • 横着して git add . しないようにしましょう
  • 横着して git add . しないようにしましょう

大事なことなので2回言いました。おわり。

参考

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4