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


# 問題
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のインストール方法は各環境によって違うため，[ホームページ](https://github.com/newren/git-filter-repo)を参照．
今回は，筆者が行ったインストール方法を紹介する（PCはWindows11）．
GitHubの[ホームページ](https://github.com/newren/git-filter-repo)にINSTALL.mdファイルがあるためそれにのっとってインストールする．
以下，INSTALL.mdの内容
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705584/205db295-b085-8b0d-ebee-435f12f9bd5f.png)
やってることはgit filter-repoを使用したいディレクトリに，pythonファイル(git-filter-repo)をダウンロードするだけ．

## 使ってみる
git-filter-repoがダウンロードできていることを確認．また，python3で実行したいので，.py拡張子をつける．
今回は，2022_09_shimizu_MDL_image_videoをfilter-repoによって分析する．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705584/11764a72-b454-a0e8-461e-034b12a9a4a2.png)



**・gitで管理されているファイル一覧を確認**
```
python3 git-filter-repo.py --analyze
```
実行すると，以下の出力．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705584/6abbf5d3-4aa9-539a-48e5-9b7287998ab2.png)
どうやら，.git/filter-repoディレクトリ内に分析結果が書き込まれたらしいので，.git/filter-repo/analysisの中身を見てみる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705584/8a7a0b4e-f2f5-c852-607a-d2b43a9c7159.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705584/12366581-abe4-b600-6d4e-93a8a25ff894.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705584/44b347b7-5e43-51ed-0b91-4118e88baa0a.png)
削除しようとしたところ--forceをつけろと言われたので，つけて実行．
消されているかをanalyzeで確認する．
確認手順は，以下．
1. filter-repo/analysisを削除．上書きができないのでめんどくさいが削除する必要あり．
2. --analyzeし，.git/filter-repo/analysis/に分析結果を書き込み
3. .git/filter-repo/analysis/のpath-all-sizes.txtを確認


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705584/c3dde533-e395-e508-4666-4e2f9546eb6e.png)

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




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

**手順まとめ**
1. git-filter-repoをダウンロード
1. ```python3 git-filter-repo.py --analyze```　コマンド実行．
1. .git/filter-repo/analysis/path-all-sizes.txtを確認
1. ```python3 git-filter-repo.py --path plot.py --invert-path```　コマンド実行