GitHubに誤って大きなファイルをプッシュしてしまうと、リポジトリの管理が煩雑になるだけでなく、GitHubのファイルサイズ制限(最大100MB)を超える場合はプッシュ自体が失敗することがあります。ここでは、大きなファイルをプッシュしてしまった場合の具体的な対処法を解説します。
1. ファイルがまだ追跡されていない場合
状況
git add
を実行しておらず、git init
をしただけ、または .gitignore
を設定していない場合。
対処方法
.gitignore
ファイルを作成または編集して、大きなファイルやフォルダを追跡対象から除外します。
bash
# 例: .gitignore ファイルの内容
/node_modules/
/large_files/
*.log- Gitで追跡されていないか確認:
bash
git status - その後、通常通りのコミットを行います。
2. ファイルがステージングされた状態の場合
状況
git add
を実行してファイルがステージングされたが、まだコミットしていない場合。
対処方法
-
ステージングから対象ファイルを削除します:
bash
git reset HEAD <ファイルパス>
例:
bash
git reset HEAD large_file.zip -
.gitignore
に追跡対象外の設定を追加します。 -
必要に応じて再度ステージングしてコミットします。
3. 大きなファイルがコミットされ、まだプッシュしていない場合
状況
git commit
まで実行したが、リモートリポジトリ(GitHub)にはプッシュしていない場合。
対処方法
-
コミット履歴から大きなファイルを削除します:
bash
git rm --cached <ファイルパス>
例:
bash
git rm --cached large_file.zip -
削除後、再度コミット:
bash
git commit --amend -m "Remove large file from history" -
.gitignore
に大きなファイルを追加します。
4. 大きなファイルをプッシュしてしまった場合
状況
すでにGitHubにプッシュ済みで、大きなファイルを削除したい場合。
対処方法
リモートリポジトリの履歴を修正する必要があります。以下の方法を検討してください。
方法1: BFG Repo-Cleanerを使用する
BFG Repo-Cleaner は、大きなファイルを含むリポジトリを簡単に修正できるツールです。
-
BFGをインストールします:
bash
brew install bfg # macOSの場合
または、公式サイトからダウンロードします。 -
リポジトリのバックアップを作成:
bash
git clone --mirror <リポジトリURL>
cd <リポジトリ>.git -
大きなファイルを削除:
bash
bfg --delete-files <ファイル名>
または、特定サイズ以上のファイルを削除:
bash
bfg --strip-blobs-bigger-than 50M -
修正内容をプッシュ:
bash
git reflog expire --expire=now --all && git gc --prune=now --aggressive
git push --force
方法2: Gitの公式フィルタリングツールを使用
Gitの filter-repo
を使用して履歴を修正します。
-
必要なツールをインストール:
bash
pip install git-filter-repo -
不要なファイルをリポジトリ履歴から削除:
bash
git filter-repo --path <ファイルパス> --invert-paths -
修正内容をプッシュ:
bash
git push --force
5. Git LFSを使用する場合
もし大きなファイルをリポジトリに含める必要がある場合は、Git Large File Storage (Git LFS) を使用します。
- Git LFSをインストール:
“`bash
# macOS
brew install git-lfs
# Ubuntu
sudo apt install git-lfs
“`
-
Git LFSを有効化:
bash
git lfs install -
大きなファイルをGit LFSで追跡:
bash
git lfs track "<ファイルパス>"
git add .gitattributes
git commit -m "Track large files with Git LFS" -
ファイルをプッシュ:
bash
git push origin main
まとめ
- まだ追跡していない場合:
.gitignore
を設定して不要なファイルを除外。 - コミット済みの場合:
git rm --cached
を使用してインデックスから削除。 - プッシュ済みの場合:
BFG Repo-Cleaner
またはgit filter-repo
で履歴を修正。 - 必要な大きなファイル: Git LFSで管理。