開発中のアプリで大きめのファイル(100MBオーバー)をコミットしてしまい、GitHubにプッシュできなくなったときに対処したときのメモです。
GitHubの容量制限
GitHubは1ファイル100MBの制限がありました
https://docs.github.com/ja/repositories/working-with-files/managing-large-files/about-large-files-on-github
今回OpenSearchの辞書ファイルが100MBを超えており、このファイルをコミットしてしまったことでGitHubに拒否されるようになっていました。
Source Treeでのエラー
こんな感じのエラーが表示されます
git rmで直近のコミットから対象のファイルを取り除くことが出来たのですが、コミット履歴からは削除出来ないためPushが出来ない状態となってしまいました
BFG-Repo-Cleanerを利用して履歴から巨大ファイルを削除する
GitHub公式ページで履歴から巨大ファイルを削除する方法としてこのツールが紹介されていました。
実際に利用したときの内容をメモします。
1.公式ページからjarファイルをダウンロード
公式ページのダウンロードアイコンからjarをダウンロードします
https://rtyley.github.io/bfg-repo-cleaner/
ダウンロード先は削除対象ファイルが存在するGitRepositoryのフォルダとしました
2.削除コマンドで対象ファイルを削除
今回は*.dicファイルが巨大なファイルだったため、以下のコマンドを利用して削除しました
java -jar bfg-1.14.0.jar --delete-files "*.dic" .git
実行ログはこんな感じです
Using repo : /Users/user/Project/ApplicationProject/RIDE-Mono/.git
Found 90 objects to protect
Found 5 commit-pointing refs : HEAD, refs/heads/develop, refs/heads/master, ...
Protected commits
-----------------
These are your protected commits, and so their contents will NOT be altered:
* commit 246d9fba (protected by 'HEAD')
Cleaning
--------
Found 12 commits
Cleaning commits: 100% (12/12)
Cleaning commits completed in 96 ms.
Updating 1 Ref
--------------
Ref Before After
----------------------------------------
refs/heads/develop | 246d9fba | 2cfc19ac
Updating references: 100% (1/1)
...Ref update completed in 53 ms.
Commit Tree-Dirt History
------------------------
Earliest Latest
| |
. . .D D DD D DD m m
D = dirty commits (file tree fixed)
m = modified commits (commit message or parents changed)
. = clean commits (no changes to file tree)
Before After
-------------------------------------------
First modified commit | 3a14143f | 3546dc62
Last dirty commit | f946ef26 | ffe1014b
Deleted files
-------------
Filename Git id
---------------------------------------------------------
system_core.dic | b2fd0310 (206.0 MB), 22baeb91 (134 B )
system_full.dic | a5ade49a (343.0 MB), 5b05101d (134 B )
system_small.dic | 6b055387 (134 B ), 0a967512 (117.3 MB)
In total, 33 object ids were changed. Full details are logged here:
/Users/user/Project/ApplicationProject/RIDE-Mono/.git.bfg-report/2024-05-29/09-41-38
BFG run is complete! When ready, run: git reflog expire --expire=now --all && git gc --prune=now --aggressive
3.リポジトリの不要情報の削除と強制プッシュ
実行ログの最後に以下のコマンドが表示されるため、実行します
このコマンドはリポジトリに対してガベージコレクションを行い、不要な情報を削除してリポジトリサイズを縮小させるとのこと
(By ChatGPT)
git reflog expire --expire=now --all && git gc --prune=now --aggressive
その後、強制プッシュします
(–forceを付ける理由はローカルとサーバー(GitHub)で整合性が崩れるため)
git push --force
無事にプッシュできました
Enumerating objects: 173, done.
Counting objects: 100% (173/173), done.
Delta compression using up to 12 threads
Compressing objects: 100% (54/54), done.
Writing objects: 100% (124/124), 27.33 KiB | 13.67 MiB/s, done.
Total 124 (delta 68), reused 106 (delta 52), pack-reused 0
remote: Resolving deltas: 100% (68/68), completed with 27 local objects.
To https://github.com/sheltie-fusafusa/Project-RIDE-Mono.git
3c27f71..2cfc19a develop -> develop
以上
巨大なファイルをコミットしてしまったときの対処法でした
以降はGit lfsを導入してきちんと管理していきたいと思います