誤ってGitHubにコミットした機密ファイルを履歴ごと削除する【git filter-repo】

IT全般
スポンサーリンク

うっかりコミットしてしまった機密情報、どうする?

設定情報をうっかり過去にGitでコミット・pushしてたんだけど、どうしよう…

過去の履歴を見ると内容が見えちゃってますねー

開発中に .env や config.php などのファイルをうっかりGitでコミット・pushしてしまった経験はありませんか?

  • .gitignore を追加しても、過去のコミット履歴にはそのファイルが残り続けます。
  • 公開リポジトリだった場合、第三者に機密情報が知られてしまう可能性もあります。

本記事では、GitHubにpushしてしまった機密ファイルを履歴ごと安全に削除する方法を解説します。

実行環境について

本記事は、以下の環境を前提に作業を行っています。

  • macOS Sonoma(Apple Silicon)
  • Git 2.33.1
  • Homebrew 4.4.17
  • git-filter-repo 2.38.0

※ Windows や Linux でも基本的な手順は同様ですが、インストール方法が一部異なります。

使用ツール:git filter-repo とは?

git filter-repo は、Gitのコミット履歴を書き換える強力なツールです。
Gitの標準機能 filter-branch より高速・高機能で、推奨されています。

  • 特定のファイルだけを完全に削除
  • ブランチ履歴をすべて対象にできる
  • 誤操作を防ぐため、使用には注意が必要です

git filter-repo のインストール

macOS(Homebrew使用)

brew install git-filter-repo

Windows / Linux

GitHubの公式ページからスクリプトをダウンロードします。

🔗 https://github.com/newren/git-filter-repo

インストール後、以下のコマンドでバージョンが確認できればOKです。

git filter-repo --version

 削除対象のファイル例

今回は以下の機密ファイルを誤ってGitHubにアップしてしまったとします。

  • includes/db.php
  • includes/config.php

削除手順

① リポジトリのクローンを作り直す

まずは、履歴を書き換えても影響がないように、新しいクローン(mirror)を作成します。
以下の例では、temp-repoディレクトリにクローンを作成します。

cd ..
git clone --mirror https://github.com/ユーザー名/リポジトリ名.git temp-repo
cd temp-repo

② 不要ファイルを履歴ごと削除

次のコマンドで、特定ファイルを過去の履歴から完全に削除します。

git filter-repo \
  --path includes/db.php \
  --path includes/config.php \
  --invert-paths

🔍 –invert-paths オプションを使うことで、指定ファイルを完全に除外します。

③ GitHubに強制push

mirror clone では origin が設定されていないので、リモートを追加してから push します。

# リモート登録
git remote add origin https://github.com/ユーザー名/リポジトリ名.git

# 履歴を上書き(慎重に!)
git push --force --all origin
git push --force --tags origin

⚠️ 注意:この操作により、リモートリポジトリ上の履歴が完全に置き換わります。他の開発者にも影響するため、事前に共有・了承を得ましょう。

削除確認

以下のコマンドで、該当ファイルが履歴に含まれていないか確認します。

git log --all -- includes/config.php

何も表示されなければ、履歴から完全に削除されています。

⚠️ チーム開発中の注意点

  • 履歴が書き換わったため、他のメンバーには「リポジトリを再cloneしてもらう」必要があります。
  • 既存の履歴が残った状態で pull するとコンフリクトの原因になります。

元の作業ディレクトリで履歴を更新する

リモートリポジトリの履歴から機密ファイルを削除したあと、元の開発ディレクトリで作業を続けるための手順をご紹介します。

リモートの新しい履歴に完全同期させる

git fetch origin
git reset --hard origin/main

これにより、元のローカル環境の履歴がリモートと一致し、削除済みのファイルは履歴からも削除されます。

今後の再発防止策

.env ファイルに機密情報をまとめ、Gitで管理しない

ソースコードに パスワードやAPIキーを直接書くのはNG です。

代わりに .env というファイルを使って、環境ごとに切り替え可能な設定として管理するのが一般的です。

.env ファイルの例(※Gitにはアップしません) 

DB_HOST=localhost
DB_USER=ユーザ名
DB_PASSWORD=パスワード

この .env ファイルを .gitignore に追加しておけば、GitHubにアップされる心配がなくなります。

# .gitignore に追加
.env

アプリケーションからの読み込み方法(PHPの場合)

// PHPで .env を読み込む例(vlucas/phpdotenv を使用)
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();

$db_user = $_ENV['DB_USER'];
$db_password = $_ENV['DB_PASSWORD'];

.env ファイルを使うことで、

  • 機密情報を外部ファイルにまとめて管理できる
  • 環境(本番・開発)ごとに設定を切り替えやすい
  • セキュリティ対策としても安心

というメリットがあります。

まとめ

内容説明
ツールgit filter-repo
対象履歴に残ったファイルを削除したいとき
注意点履歴が書き換わる → 強制push、チームに通知必須
再発防止.envファイル管理、トークン検出ツールの導入

Gitは便利な反面、間違ったファイルを一度コミットすると履歴にずっと残ります。

万が一のときに冷静に対応できるよう、こうした対処法を知っておくことはとても重要ですね。

コメント

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