LoginSignup
1
0

More than 1 year has passed since last update.

git pushで起きた問題と解決方法をまとめてみた

Last updated at Posted at 2022-08-28

問題

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の内容
image.png
やってることはgit filter-repoを使用したいディレクトリに,pythonファイル(git-filter-repo)をダウンロードするだけ.

使ってみる

git-filter-repoがダウンロードできていることを確認.また,python3で実行したいので,.py拡張子をつける.
今回は,2022_09_shimizu_MDL_image_videoをfilter-repoによって分析する.
image.png

・gitで管理されているファイル一覧を確認

python3 git-filter-repo.py --analyze

実行すると,以下の出力.
image.png
どうやら,.git/filter-repoディレクトリ内に分析結果が書き込まれたらしいので,.git/filter-repo/analysisの中身を見てみる.
image.png
色々な情報がテキストファイルに書き込まれている.それぞれ以下の内容.

  • path-all-sizes.txt:gitで管理されている全ファイルの情報
  • path-deleted-sizes.txt:過去に削除されたファイル
  • directories-all-sizes.txt:gitで管理されている全部のディレクトリ
  • directories-deleted-sizes.txt:過去に削除されたディレクトリ

今回は容量が大きいファイルを特定したいのでpath-all-sizes.txtの中身をチェック.
image.png
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を削除してみる.
image.png
削除しようとしたところ--forceをつけろと言われたので,つけて実行.
消されているかをanalyzeで確認する.
確認手順は,以下.

  1. filter-repo/analysisを削除.上書きができないのでめんどくさいが削除する必要あり.
  2. --analyzeし,.git/filter-repo/analysis/に分析結果を書き込み
  3. .git/filter-repo/analysis/のpath-all-sizes.txtを確認

image.png

少し見にくいが,一覧からplot.pyが消えているのが分かる.

まとめ

今回はgit pushで発生した問題と解決方法について紹介した.gitはファイルの内容だけでなく,履歴(commitしたなど)も記憶しているため,ただrmで削除しても意味がない.そのため,git filter-repoを使用して削除を行った.今後はgit filter-branchの問題について調べたい.

手順まとめ

  1. git-filter-repoをダウンロード
  2. python3 git-filter-repo.py --analyze コマンド実行.
  3. .git/filter-repo/analysis/path-all-sizes.txtを確認
  4. python3 git-filter-repo.py --path plot.py --invert-path コマンド実行
1
0
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
1
0