エンジニアの皆さん、こんにちは。現場で戦うための「Gitの裏技」を伝授する時間がやってきました。
開発の現場で一番冷や汗をかく瞬間、それは「やってしまった……」という時ではないでしょうか。そう、APIキーやパスワード、あるいは数ギガバイトの巨大なバイナリファイルを、誤ってGitリポジトリにコミットしてしまったあの瞬間です。
「`.gitignore`に追加すればいいんでしょ?」……甘い。それは「見えなくした」だけで、リポジトリの歴史の深淵には、その機密情報がしっかりと刻み込まれています。これを放置するのは、家に鍵をかけずに玄関を開けっ放しにするのと同じ。
今日は、その「消えない過去」を物理的に消し去るための、唯一無二の正解ツール`git-filter-repo`について解説します。
—
なぜ `filter-branch` を使ってはいけないのか?
かつて、Gitには `git filter-branch` というコマンドがありました。しかし、これは現在「非推奨(deprecated)」です。動作が非常に遅く、かつ誤った使い方をするとリポジトリを破壊するリスクが高いためです。
今、現場のプロが選ぶのは `git-filter-repo` です。これはGit公式の設計者が推奨しているツールで、圧倒的に高速で、安全、かつ直感的に履歴を書き換えることができます。
—
1. 導入:まずはツールをインストールしよう
`git-filter-repo` はPythonで書かれています。まずはサクッとインストールしましょう。
Python環境があればpipで一発です
pip install git-filter-repo
※ macOSなら `brew install git-filter-repo` でもOKです。これで準備完了。
—
2. 「HelloWorld」的な動作確認:不要なファイルを全削除する
特定のファイルをリポジトリの全履歴から抹消する、最も基本的な操作を見ていきましょう。
例えば、`config/secrets.json` という機密ファイルが含まれてしまったとします。これを「最初から無かったこと」にするコマンドはこれだけです。
1. まずはリポジトリのコピーをクローン(失敗時のバックアップのため必須!)
git clone –mirror <リポジトリのURL> backup-repo
cd backup-repo
2. 対象ファイルを履歴から完全に抹消
git filter-repo –path config/secrets.json –invert-paths
3. リモートへ強制プッシュ(注意!)
git push origin –force –all
解説:
- `–path`: 削除したいファイルのパスを指定します。
- `–invert-paths`: 「指定したパス以外を保持する」というオプションです。つまり、指定したファイルだけが歴史から消えます。
- `git push –force`: これでリモートにある「過去の汚れた履歴」を上書きします。
—
3. 現場で役立つ「極限の知見」:注意点とハック
このツールは非常に強力です。だからこそ、以下の「プロの鉄則」を守ってください。
① 必ずクローンで作業する
`filter-repo` は作業中のリポジトリ自体を書き換えます。失敗した時に取り返しがつかなくなるため、必ず `git clone –mirror` した環境で行いましょう。
② チームメンバー全員に通知する
履歴を書き換えるということは、コミットハッシュ(ID)がすべて変わるということです。チーム全員がリポジトリを再クローンする必要があります。 これを怠ると、メンバーがプッシュした瞬間に「歴史の不一致」で大混乱が起きます。必ず「いつ作業を行うか」を共有してください。
③ `.gitignore` を同時に更新する
履歴から消すだけでは不十分です。同じ過ちを繰り返さないよう、必ず `.gitignore` に対象ファイルを追加し、`git add .gitignore && git commit` しておくことを忘れないでください。
—
4. まとめ:なぜこのツールが最強なのか
`git-filter-repo` は、リポジトリの構造を深く理解し、効率的に書き換えるために設計されています。
- 高速: 大規模なリポジトリでも数分で終わります。
- 安全: 意図しない改変を防ぐためのチェック機能が組み込まれています。
- クリーン: 削除後のリポジトリは、まるで最初からそのファイルが存在しなかったかのように軽量になります。
もし今日、あなたが「やらかしてしまった」なら、焦らずにこのツールを使ってください。エンジニアにとって、ミスを正しく修正する能力もまた、立派なスキルです。
これをマスターすれば、あなたのリポジトリは常に清潔で、セキュアに保たれるようになりますよ。さあ、クリーンな開発ライフを楽しみましょう!