You are currently viewing 巨大なファイルをコミットしてGitHubにプッシュできなくなったときの対応

巨大なファイルをコミットしてGitHubにプッシュできなくなったときの対応

開発中のアプリで大きめのファイル(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を導入してきちんと管理していきたいと思います

コメントを残す