[git]巨大ファイルを履歴からの完全削除手順

TIPS

誤ってプッシュしてしまった巨大ファイルを、Gitの履歴から完全に抹消するための手順です。

状況に合わせて「A」または「B」の手順を実行してください。

パターンA: 誤ってプッシュしたのが「直前の1つのコミット」だけの場合

コミットしてプッシュした直後に気づき、その後まだ何も新しいコミットをしていない場合は、この方法が一番簡単です。

1. リポジトリからファイルを削除(手元のファイルは残す)

以下のコマンドで、Gitの管理からのみファイルを外します。

git rm --cached <巨大ファイルのパス>

※ファイルそのものをPCから消して良い場合は --cached は不要です。

2. .gitignore に追加する(再発防止)

同じファイルをまたコミットしないように、.gitignore に追記します。

echo "<巨大ファイルのパス>" >> .gitignore
git add .gitignore

3. 直前のコミットを上書きする

直前のコミットの内容を、ファイルが削除された状態に上書き(Amend)します。

git commit --amend --no-edit

4. リモートへ強制プッシュ(Force Push)

履歴を書き換えたため、通常のプッシュは弾かれます。強制プッシュでリモートの履歴を上書きします。

git push -f origin <現在のブランチ名>

パターンB: 数世代前のコミットに混ざっている場合(最も確実な完全削除)

すでにいくつかのコミットを重ねてしまっている場合や、完全にリポジトリの容量を減らしたい場合は、公式が推奨しているツール git filter-repo を使用します。(古い git filter-branch は非推奨・激遅のため使用しません)。

1. 準備: ツールのインストール

Pythonがインストールされている環境で、以下のコマンドを実行してツールをインストールします。

Mac (Homebrew) の場合:

brew install git-filter-repo

Windows / Linux (pip) の場合:

pip install git-filter-repo

2. ローカルリポジトリを最新にする

念のため、現在の状態を最新にしておきます。

git pull

3. 履歴から巨大ファイルを抹消する

以下のコマンドを実行すると、リポジトリの全履歴から指定したファイルが完全に削除されます。

git filter-repo --invert-paths --path <巨大ファイルのパス>

(例: git filter-repo --invert-paths --path data/large_video.mp4)

※このコマンドを実行すると自動的にリポジトリが整理され、ローカルの .git フォルダの容量も劇的に軽くなります。

4. リモートリポジトリの紐付けを直す

git filter-repo を実行すると、安全のためリモート(origin)の設定が解除されます。再度設定し直します。

git remote add origin <リモートリポジトリのURL>

5. リモートへ強制プッシュ(Force Push)

書き換えたクリーンな履歴をリモートに強制的に反映させます。全ブランチを対象にプッシュします。

git push origin --force --all

⚠️ チーム開発時の超重要事項(必ず読んでください)

履歴の書き換え(Force Push)を行ったリポジトリは、他のチームメンバーの手元にある古いリポジトリと整合性が取れなくなります。

あなたが強制プッシュを完了した直後に、チームメンバーには以下の対応をお願いしてください。

チームメンバーにやってもらうこと:

既存のローカルリポジトリで普通に git pull すると履歴がバグります。以下のコマンドで、リモートのクリーンな履歴を強制的にローカルに同期してもらってください。

git fetch origin
git reset --hard origin/<対象ブランチ>

※または、一度ローカルフォルダを丸ごと削除して、新しく git clone し直すのが最も確実で安全です。

コメント

タイトルとURLをコピーしました