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

TIPS
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 <現在のブランチ名>
[git]巨大ファイルを履歴からの完全削除手順
Github ActionsからGitlab CI/CDに移行
GitHub ActionsからGitLab CI/CDへの移行における概念や構文の対応関係、具体的な設定ファイルの書き換え方法を解説。並列実行やマトリックスビルドの移行手順を学び、効率的なパイプライン構築と円滑な移行を実現する知見が得られます。

パターン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
[git]巨大ファイルを履歴からの完全削除手順
[Strix]ローカルAPIをセキュリティ検証
AIを活用したOSSペネトレーションテストツール「Strix」を使い、Ubuntu環境でローカルAPIの脆弱性診断を自動化する方法を解説。OpenAPI仕様書を用いた診断手順や、LLMの設定、コスト管理などの実践的なノウハウが学べます。

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

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

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

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

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

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

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

Q よくある質問 (FAQ)
Q. 過去の履歴から巨大ファイルを削除する際、なぜ git filter-branch ではなく git filter-repo を使うのですか?
A.
git filter-branchは処理が非常に遅く、公式でも非推奨となっているためです。git filter-repoを使用することで、高速かつ安全にリポジトリの全履歴からファイルを抹消できます。
Q. 履歴を強制プッシュ(Force Push)した後、他のチームメンバーはどのような対応が必要ですか?
A.
普通にgit pullすると履歴の整合性が崩れてしまうため、git reset --hard origin/main 等でリモートの履歴に強制同期するか、リポジトリを再クローンする必要があります。

コメント

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