
Git でファイルを管理対象から外す方法
1. はじめに
「このファイル、もう Git で追跡したくない!」
開発を進めていると、こんな場面によく遭遇します:
- ログファイル や キャッシュ が誤ってコミットされた
- ビルド成果物 を除外し忘れた
すでに 追跡中のファイルを外したい 場合、単に .gitignore
に追加するだけでは不十分です。リポジトリ履歴からは残しつつ 今後は追跡しない ようにする正しい手順を解説します。
2. 基本的な手順
2.1. ステップ 1: .gitignore に追加
まず、今後追跡したくないファイルを .gitignore
に記載します。
# .gitignore
config/database.yml
logs/*.log
node_modules/
2.2. ステップ 2: インデックスから削除
git rm --cached <ファイルパス>
--cached
オプションがポイント:
- インデックス(追跡対象)からのみ削除
- ワークツリー(実際のファイル)は残る
2.3. ステップ 3: コミット
git commit -m "Stop tracking config/database.yml"
これで完了!次回以降、そのファイルは Git の管理対象外になります。
3. ディレクトリ全体を除外する場合
ディレクトリの場合は -r
オプションが必要です。
私の例だと、アプリが加工したデータをdata
ディレクトリ配下に出力していました。ディレクトリの場合だと以下のコマンドを実行すると。。。
git rm --cached data/
以下のエラーが出ます:
fatal: not removing 'data/' recursively without -r
解決方法:-r
オプションを追加
git rm --cached -r data/
これで追跡中のディレクトリごと管理対象から外れます。
4. よくある間違いと注意点
4.1. ⚠️ 注意:–cached を忘れると危険
git rm secret.txt # ファイルが物理削除される!
--cached
オプションを忘れると、ワークツリーからもファイルが削除されてしまいます。
5. 履歴からも完全に削除したい場合
注意:これは危険な操作です。チーム開発では慎重に慎重を重ねましょう。
# 履歴からも完全に削除(BFG Repo-Cleaner を使用)
# ※事前にバックアップを取ること
java -jar bfg.jar --delete-files secret.txt repo.git
cd repo.git
git reflog expire --expire=now --all
git gc --prune=now --aggressive