はじめに
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回言いました。おわり。
参考