Git Desktopでpushが出来ない(大きいファイルをpushしてしまった時)
いつもgitを間違えてギットと読んで後輩に指摘されるマンです。
gitあんまり馴染みがなかったのでDesktopアプリを主に使うマンなんですが突然Git Desktopでpush(sync)出来ない事態に襲われました。
メモしながらやったので結果だけ知りたい方は(危険です)解決編をご覧あれ。
最初の原因:重いファイルをcommit,pushした。
shellで
git push
と打つと,「 this exceeds GitHub's file size limit of 100.00 MB 」と出ます。
Gitでは100MB以上のファイルpushできないようです。
gitignoreの変更と反映
gitで不要なファイルを無視する設定を保存するために.gitignoreというファイルがあります。
これに先程の.matファイルを登録したのですがそれでもダメでした。
git rm --cached . git add .gitignore git commit -m "add file to .gitignore" git push origin master
一行目で全てキャッシュを消して,その後にgitignoreを変更,変更をcommitしてpushするという流れのようです。
これでも上手く行きませんでした!
大きいファイルをpushしてしまったときの対処法
先程の変更でもダメです。
何故なら大きいファイルを追加・変更したという情報がgitに残っているのでこいつはいつまでも追加対象から外れてくれないのです。
公式でもこの問題について言及してくれています。
Removing files from a repository's history - User Documentation
結論これではダメでした。
また,以下のブログが非常に参考になりました。
www.walbrix.com
過去の履歴全てから削除するとのこと。
以下のブログでも同様のことを言っています。
Gitリポジトリから容量の大きいファイルを履歴から抹消する | eureka tech blog
$ git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch でかいファイル' --prune-empty --tag-name-filter cat -- --all $ git commit --amend -CHEAD
これででかいファイルの情報を過去に渡って潰すわけです。
しかし,その後のコミットであえなく爆死。
そして出て来るWarning。
WARNING: Ref 'refs/heads/master' is unchanged WARNING: Ref 'refs/remotes/origin/master' is unchanged
いろいろ調べましたがこの方向性は結局あきらめました。
git rebaseで過去を改変?
rebaseで過去の関連コミットを全てまとめてしまえばいけるのではと思い立って行動。
git rebase -i HEAD~k
で直近からk番目のcommitをまとめることが出来ます。
これで過去のクソコミットをまとめてしまおうという算段。
すると…以下のエラーが
You must edit all merge conflicts and then mark them as resolved using git add
調べると手動でconflictをなんとかしろとのこと。憤死。
原因
この前の段階でWeb側で.gitignoreを変更したのが大きな原因らしいです。
無知で動くの本当に良くないですね。
解決編
本当は該当ファイルを撤去して,logを全て飛ばすので十分なんでしょうが,今回はいろいろと込み入ったため,
commitを強制的にふっ飛ばして解決するという手法をとりました。
git rebase -i 十分な分のcommitを遡る
そして,文頭に出てくる幾つかのcommitを削除消します。
これがスムーズに行けば一連の問題はおそらく解決です。
そして強制的にpushするために
git push -f
をします。これも禁じ手の1つで複数人で管理士ているファイルでやっては絶対にいけません。
なお,rebaseでなんか言われたときには
git rebase --skip
でぶっ飛ばしちゃいましょう。
なお,これは本当に最終手段に近いと思ってください。
考えるんだ…まだ手はあるはずだ…
あとバックアップは忘れずに。
総評・感想
とりあえず,
shellときちんと向き合うこと。
Web上のgitを安易に編集しないこと,
事前にきちんとgitignoreを管理すること,
そしてgit外でもデータをバックアップしておくことが肝要です。
まじで!!!