問題
git pushを実行すると問題発生.
どうやらpushするファイルが大きすぎてエラーが起きているらしい.
$ git push origin main
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.
remote: error: Trace: #######
remote: error: See https://help.github.com/articles/working-with-large-files/ for more information.
remote: error: File {LARGE_FILE} is 150.00 MB; this exceeds GitHubs file size limit of 100.00 MB
To https://github.com/{USER}/{REPO}.git
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://github.com/{USER}/{REPO}.git'
解決方法
git filter-repoを使用し,容量の大きいファイルの特定,削除を行う.
ここで,rmコマンドでファイルを削除してもgitの記録は残ったままなので,注意.
ということで,git filter-repoの使い方を紹介していく.
git filter-branchでのやり方が多く紹介されているが,うまくいかなかったためこちらの方法を紹介する.git filter-repoの方が圧倒的に早いのでこちらを推奨.
git filter-repoの使い方
git filter-repoのインストール(Windows)
git filter-repoのインストール方法は各環境によって違うため,ホームページを参照.
今回は,筆者が行ったインストール方法を紹介する(PCはWindows11).
GitHubのホームページにINSTALL.mdファイルがあるためそれにのっとってインストールする.
以下,INSTALL.mdの内容
やってることはgit filter-repoを使用したいディレクトリに,pythonファイル(git-filter-repo)をダウンロードするだけ.
使ってみる
git-filter-repoがダウンロードできていることを確認.また,python3で実行したいので,.py拡張子をつける.
今回は,2022_09_shimizu_MDL_image_videoをfilter-repoによって分析する.
・gitで管理されているファイル一覧を確認
python3 git-filter-repo.py --analyze
実行すると,以下の出力.
どうやら,.git/filter-repoディレクトリ内に分析結果が書き込まれたらしいので,.git/filter-repo/analysisの中身を見てみる.
色々な情報がテキストファイルに書き込まれている.それぞれ以下の内容.
- path-all-sizes.txt:gitで管理されている全ファイルの情報
- path-deleted-sizes.txt:過去に削除されたファイル
- directories-all-sizes.txt:gitで管理されている全部のディレクトリ
- directories-deleted-sizes.txt:過去に削除されたディレクトリ
今回は容量が大きいファイルを特定したいのでpath-all-sizes.txtの中身をチェック.
change_model/intor.ipynbを例に説明すると,左の二つの値が圧縮してないときの容量としたときの容量,その隣のpresentがファイルがまだ残っているかを表している.ここからも分かるようにファイルを削除してもgitに履歴が残ってしまう.
・ファイルを履歴と削除
・hoge/file/とhoge/a.txtを削除
python3 git-filter-repo.py --path hoge/file/ --path hoge/a.txt --invert-path
実際に,ファイルを履歴ごと削除してみる.執筆時には問題が解決した後(容量が大きいファイルを削除後)だったので,今回は例としてplot.pyを削除してみる.
削除しようとしたところ--forceをつけろと言われたので,つけて実行.
消されているかをanalyzeで確認する.
確認手順は,以下.
- filter-repo/analysisを削除.上書きができないのでめんどくさいが削除する必要あり.
- --analyzeし,.git/filter-repo/analysis/に分析結果を書き込み
- .git/filter-repo/analysis/のpath-all-sizes.txtを確認
少し見にくいが,一覧からplot.pyが消えているのが分かる.
まとめ
今回はgit pushで発生した問題と解決方法について紹介した.gitはファイルの内容だけでなく,履歴(commitしたなど)も記憶しているため,ただrmで削除しても意味がない.そのため,git filter-repoを使用して削除を行った.今後はgit filter-branchの問題について調べたい.
手順まとめ
- git-filter-repoをダウンロード
-
python3 git-filter-repo.py --analyze
コマンド実行. - .git/filter-repo/analysis/path-all-sizes.txtを確認
-
python3 git-filter-repo.py --path plot.py --invert-path
コマンド実行