背景
ローカル環境での開発を進める中で、以下のような2つの課題が発生していました。
- Cursorのワークスペース設定(.code-workspace)が変更を検知してしまう
自分好みのエディタ設定や拡張機能の設定を含めたワークスペースファイルを作ったが、これは自分専用のもの。チーム共通の .gitignore に追跡対象外として勝手に追加するわけにはいかず、かといって毎回 git status に表示されるのがノイズになっていた。 - ローカル検証のために、外部連携のコードをコメントアウトしたファイルがコミット対象に入ってしまう
外部APIやステージング環境との連携を一時的に無効化したコードでローカル開発を行いたいが、そのファイル自体はリポジトリで追跡されている重要ファイル。うっかりそのまま git commit や git push をしてしまいそうになるリスクがあった。
これらはどちらも「Gitの変更検知から外したい」という要望ですが、対象のファイルが Gitに追跡されているかどうか でアプローチを変える必要があります。
対策
結論として、今回のケースは以下の2つの機能を使い分けることで綺麗に解決できました。
- Cursorの .code-workspace(未追跡ファイル)
.git/info/exclude を使用して、自分専用の無視リストに登録する。
一言で言えば「自分専用・ローカル専用の .gitignore」です。 - 外部連携をコメントアウトしたファイル(追跡中ファイル)
git update-index –skip-worktree を使用して、ローカルの変更をGitに無視させる。
2つのアプローチの違い
| 機能 | 対象ファイルの状態 | 今回のユースケース |
| .git/info/exclude | 未追跡(Untracked) | 自分専用のエディタ設定ファイル(.code-workspace)の除外 |
| –skip-worktree | 追跡中(Tracked) | 外部連携をコメントアウトした共通ファイルの変更無視 |
どちらも設定は自分のローカル環境(.git ディレクトリ内など)にのみ閉じているため、リモートリポジトリや他のメンバーの環境を汚すことはありません。
具体的な設定手順
1. Cursorの設定ファイルを隠す(.git/info/exclude)
.git/info/exclude は、リポジトリにコミットされない「自分専用の .gitignore」です。
.git/info/exclude ファイルをエディタで開き、最下部に以下の行を追加します。
*.code-workspace
これで、共通の .gitignore を編集することなく、自分だけの環境でワークスペースファイルが git status に表示されなくなります。
2. 追跡中ファイルのローカル変更を一時的に無視する(–skip-worktree)
git update-index コマンドを使用します。
外部連携をコメントアウトした対象ファイルに対して、以下のコマンドを実行します。
git update-index --skip-worktree {ファイル名}
これで、ローカルでどれだけコードを書き換えても、Gitは変更がないものとして扱ってくれます。
設定を戻したい時、確認したい時
開発が終わり、元の状態(Gitの追跡対象)に戻したい場合は –no-skip-worktree を指定します。
# 設定の解除
git update-index --no-skip-worktree {ファイル名}
# 現在 skip-worktree しているファイルの一覧確認
git ls-files -v | grep '^S'
※ git ls-files -v を実行した際、頭に S(Skip-worktreeの略)がついているファイルが、現在無視されているファイルです。
リモートで変更があった時の挙動
–skip-worktree を設定しているファイルに対して、他のメンバーが変更を加えてリモートリポジトリに push し、それを自分が pull しようとした場合、Gitがコンフリクトを検知し、以下のようなエラーを出してマージ処理を安全にストップしてくれます。
error: Your local changes to the following files would be overwritten by merge:
path/to/file.ts
Please commit your changes or stash them before you merge.
Aborting
このエラーが出た場合、複雑な git stash を使うよりも、「一度設定を解除して変更を破棄し、pullした後に再度変更する」 のが一番シンプルで手戻りがありません。
具体的には、以下の4ステップでサクッと解決できます。
# 1. 一度 skip-worktree の設定を解除する
git update-index --no-skip-worktree {ファイル名}
# 2. ローカルの変更(コメントアウトなど)を破棄してリモートの状態に戻す
git checkout -- {ファイル名}
# 私はCursorからGUIで変更を破棄してます
# 3. リモートの最新コードを pull する
git pull origin main
# 私はCursorからGUIでpullしてます
# 4. 再度ファイルに変更を加え、skip-worktree を再設定する
# (ファイルを編集後、以下を実行)
git update-index --skip-worktree {ファイル名}
まとめ
今回は、自分専用の未追跡ファイルを隠す .git/info/exclude と、追跡中ファイルのローカル変更を無視する –skip-worktree の具体的な活用例を紹介しました。
これらを駆使することで、「うっかり不要なファイルをコミットしてしまう恐怖」や「git status が汚れるストレス」から解放され、より安全で快適なローカル開発環境を作ることができます。ぜひ試してみてください。