🗑️
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
Discussion