状況
テストのために、.env.test
を用意していたが、.gitignore
に追記していたのを忘れたため、リモートリポジトリに上げてしまった。
したいこと
-
リモートリポジトリにある
.env.test
を消したい。
しかし、ローカルリポジトリには残しておきたい。 -
(2025/4/30追記) コミットの履歴から
.env.test
を消したい。
解決策
1. まずは.gitignore
に以下を追加します:
*.env.test
2. ローカルリポジトリの.env.test
をGitの追跡から削除
.gitignore
は、「まだGitに追加されていないファイルを無視するもの」で、一度Gitに追加されているファイルを無視はできないので、追跡対象から外す必要があります。
git rm --cached .env.test
ローカルリポジトリのファイルは残してリモートリポジトリのファイルのみを消したいときは--cached
を付ける。
3. コミットして反映
git commit -m "次回以降無視されます"
git push
結果
- .env.test は GitHub 上から削除される
- ローカルには .env.test がそのまま残る
- 次回以降、.env.test の変更や追加も Git は無視される
追記(2025/4/30):GitHub上から完全削除をするために…
これで確かにリモートリポジトリからは削除されるのですが、過去のコミット履歴から.env.test
のファイルの中身を参照できてしまいます。完全削除するにはコミットの履歴から.env.test
を削除し、履歴を書き換える必要があります。
まだだ、まだ終わらんぞ…
方針
GitHub 提供するツール「BFG Repo-Cleaner」を使う
※BFG Repo-Cleanerとは
BFGは、Gitリポジトリの履歴から不要なデータを取り除くための、
git-filter-branchのシンプルで高速な代替ツールです。対応できる主な用途:
- 巨大なファイルの削除
- パスワードや認証情報などの機密データの削除
コミット履歴から削除する手順
0. 前提条件
- Ubuntu 22.04 (WSL2上)
- Javaはインストール済み
- 対象リポジトリURL(例):https://github.com/yourname/repo-exmple.git
1. 対象リポジトリを mirror モードでクローン
git clone --mirror https://github.com/yourname/repo-example.git
すると、repo-example.git
というフォルダができます。
ちなみに、mirror
モードとは、履歴の書き換えや BFG 実行時に必要な特殊モードでブランチ・タグ・リモートの設定を含む完全なコピーをします。通常の開発では使用しません。
2. BFG Repo-Cleanerをダウンロード(初回のみ)
wget https://repo1.maven.org/maven2/com/madgag/bfg/1.14.0/bfg-1.14.0.jar -O bfg.jar
3. .env.test
を履歴から削除
java -jar bfg.jar --delete-files '.env.test' study-record.git
4. Git履歴をクリーンアップ
cd repo-example.git
git reflog expire --expire=now --all
git gc --prune=now --aggressive
5. GitHub へ強制 push
git push --force
これにて履歴から削除されました。チームなどほかの開発者もいる場合ローカルリポジトリを再クローンする必要があることを共有してください。
まとめ
いや、ほんとに気を付けましょう…
参考
https://git-scm.com/docs/gitignore
https://rtyley.github.io/bfg-repo-cleaner/