
.gitignoreを編集せずにローカルだけでファイルを無視する方法まとめ
はじめに
チーム開発をしていると、自分だけが使うファイルをGitの管理対象から外したい場面がよくあります。
- 個人用のメモやTODOファイル
- IDEのワークスペース設定(
.idea/、.vscode/settings.jsonなど) - ローカル専用の
docker-compose.override.yml - デバッグ用のスクリプトやログファイル
こういったファイルを.gitignoreに追加すると、チーム全員のリポジトリに影響してしまいます。「自分のローカル環境だけで無視したい」というニーズに対して、Gitは複数の方法を用意しています。
本記事では、以下の4つの方法を実際に試しながら整理します。
| 方法 | 適用範囲 | 対象 | チームへの影響 |
|---|---|---|---|
.gitignore |
リポジトリ全体 | 未追跡ファイル | あり(コミット対象) |
.git/info/exclude |
ローカルのみ(単一リポジトリ) | 未追跡ファイル | なし |
| グローバルgitignore | ローカルのみ(全リポジトリ) | 未追跡ファイル | なし |
skip-worktree |
ローカルのみ(単一リポジトリ) | 追跡済みファイル | なし |
前提環境
- Git 2.x 以上
- macOS / Linux / Windows(コマンドは共通)
バージョン確認:
git --version
方法1: .git/info/exclude(単一リポジトリ向け)
すべてのGitリポジトリには、.git/info/excludeというファイルが存在します。このファイルは.gitignoreとまったく同じ書式で動作しますが、.git/ディレクトリの中にあるため、リモートにプッシュされることはありません。
使い方
任意のエディタで.git/info/excludeを開き、無視したいパターンを追加します。
# エディタで開く
vim .git/info/exclude
以下のように記述します。
# 個人用メモ
todo.txt
scratch/
# ローカルのログ出力
logs/
# IDE固有の設定
.vscode/settings.json
.gitignoreと同じ書式なので、ワイルドカード(*、**)やネゲーション(!)も使えます。
確認方法
# todo.txt を作成して確認
touch todo.txt
git status
todo.txtがUntracked filesに表示されなければ成功です。
ポイント
.git/ディレクトリ自体がGitの管理対象外なので、チームメンバーに一切影響しない- リポジトリごとに設定が必要
.gitignoreと同様、まだGitに追跡されていないファイルにのみ有効
方法2: グローバルgitignore(全リポジトリ向け)
.DS_Store(macOS)やThumbs.db(Windows)、*.swp(Vim)など、どのプロジェクトでも無視したいファイルがあります。毎回リポジトリごとに設定するのは面倒なので、グローバルなignoreファイルを設定できます。
設定手順
# 1. グローバルgitignoreファイルを作成
touch ~/.gitignore_global
# 2. Gitに登録
git config --global core.excludesfile ~/.gitignore_global
よくある設定例
# ~/.gitignore_global
# macOS
.DS_Store
.AppleDouble
.LSOverride
# Windows
Thumbs.db
Desktop.ini
# エディタ / IDE
*.swp
*.swo
*~
.idea/
.vscode/
# ログ・一時ファイル
*.log
*.tmp
確認方法
設定が反映されているか確認するには:
git config --global core.excludesfile
# 出力: /Users/<ユーザー名>/.gitignore_global
ポイント
- マシン上のすべてのGitリポジトリに適用される
- OS固有のファイルやエディタの一時ファイルに最適
- ファイル名や配置場所は自由(
~/.config/git/ignoreもよく使われる)
方法3: git update-index --skip-worktree(追跡済みファイル向け)
ここまでの2つの方法は、まだGitに追跡されていないファイルにしか効きません。
では、すでにリポジトリにコミットされているファイル(例:config/database.ymlや.env.example)をローカルで変更したいが、その変更をコミットしたくない場合はどうすればよいでしょうか?
skip-worktreeフラグ
# ローカルの変更をGitに無視させる
git update-index --skip-worktree path/to/file.txt
このフラグを設定すると、Gitはそのファイルのワーキングツリー上の変更を無視します。git statusにも表示されなくなります。
解除方法
# 再びGitの追跡対象に戻す
git update-index --no-skip-worktree path/to/file.txt
現在の設定を確認する
どのファイルにskip-worktreeフラグが設定されているかを一覧表示できます。
git ls-files -v | grep '^S'
Sで始まる行がskip-worktreeが設定されたファイルです。
assume-unchangedとの違い
似たコマンドにgit update-index --assume-unchangedがありますが、用途が異なります。
| 項目 | --skip-worktree |
--assume-unchanged |
|---|---|---|
| 本来の用途 | ローカルの変更を意図的に無視する | パフォーマンス最適化(大規模リポジトリ向け) |
| Gitの扱い | ワーキングツリーの変更を無視する | ファイルが変更されていないと仮定する |
git reset時の挙動 |
フラグが維持される | Gitがフラグを解除する場合がある |
| 安全性 | 意図的に使う想定なので安全 | Gitが必要に応じて上書きする可能性あり |
結論:ローカルの変更を無視したい場合は--skip-worktreeを使いましょう。 --assume-unchangedはあくまでパフォーマンスヒントであり、Gitが自動的に解除することがあります。
実際の使用例
# ローカル用のDB接続設定を変更するが、コミットしたくない
git update-index --skip-worktree config/database.yml
# ファイルを編集
vim config/database.yml
# git status には表示されない
git status
# → nothing to commit, working tree clean
Gitのignore優先順位
Gitは複数の場所からignoreルールを読み込みます。優先順位は以下の通りです(上が最優先)。
- コマンドラインパターン —
git ls-files等の--excludeオプション .gitignore(ディレクトリ内) — そのディレクトリとサブディレクトリに適用.git/info/exclude— リポジトリローカルのexcludecore.excludesfileで指定したファイル — グローバルgitignore
同じファイルに対して複数のルールがマッチする場合、最後にマッチしたパターンが優先されます。また、よりパスが深い.gitignoreのルールがより浅い.gitignoreのルールに優先します。
まとめ
| やりたいこと | 使う方法 |
|---|---|
| このリポジトリだけで未追跡ファイルを無視したい | .git/info/exclude |
| すべてのリポジトリで共通のファイルを無視したい | グローバルgitignore |
| 追跡済みファイルのローカル変更を無視したい | git update-index --skip-worktree |
| チーム全員で同じファイルを無視したい | .gitignore(従来通り) |
ローカル専用のignore設定を活用することで、.gitignoreを汚さずに自分だけの開発環境を整えることができます。特にskip-worktreeとassume-unchangedの違いは把握しておくと、思わぬトラブルを防げます。







