.gitignoreを変更せずに自分だけファイルを除外する.git/info/exclude
はじめに
Gitで管理対象から外したいファイルがあるとき、最初に思い浮かぶのは.gitignoreではないでしょうか。
しかし、次のようなケースでは、.gitignoreを編集したくないことがあります。
- 自分だけが使う補助スクリプトをリポジトリ内に置きたい
- 一時的な検証ファイルを
git statusに表示させたくない - 他社やOSSのリポジトリなので、個人的な設定をコミットしたくない
- チーム全体には不要だが、自分の開発環境では必要なファイルがある
このような場合に便利なのが、次のファイルです。
.git/info/exclude
.git/info/excludeを使うと、.gitignoreを変更せず、そのリポジトリの自分の作業環境だけで特定のファイルをGitの管理対象から除外できます。
.git/info/excludeとは
.git/info/excludeは、特定のGitリポジトリ内でのみ有効な除外設定ファイルです。
基本的な記述方法は.gitignoreと同じです。
例えば、次のようなファイルがあるとします。
project/
├── .git/
├── src/
├── docker-compose.yml
├── docker-compose.local.yml
└── personal-notes.md
docker-compose.local.ymlとpersonal-notes.mdを自分の環境だけで無視したい場合は、.git/info/excludeに次のように記述します。
docker-compose.local.yml
personal-notes.md
その後、git statusを実行しても、これらの未追跡ファイルは表示されなくなります。
git status
.git/info/excludeに指定されたパターンは、Gitの公式ドキュメントでも「特定リポジトリ固有だが、ほかの開発者と共有する必要がないファイル」に使用するものとして説明されています。
.gitignoreとの違い
.gitignoreと.git/info/excludeは、パターンの書き方についてはほぼ同じです。
大きな違いは、設定ファイル自体がGitで共有されるかどうかです。
| 項目 | .gitignore |
.git/info/exclude |
|---|---|---|
| 適用範囲 | リポジトリ | 現在のローカルリポジトリ |
| Gitで追跡できるか | できる | 通常は追跡されない |
| clone先に共有されるか | 共有される | 共有されない |
| チームメンバーにも適用されるか | 適用される | 適用されない |
| 主な用途 | プロジェクト共通の除外設定 | 個人用・一時的な除外設定 |
.gitignoreはリポジトリにコミットできるため、チーム全体で共有されます。
一方、.git/info/excludeは.gitディレクトリ内に存在します。.gitディレクトリそのものはリポジトリの管理情報であり、通常のソースコードとしてコミットされません。
そのため、.git/info/excludeの内容は自分のローカル環境にだけ残ります。
基本的な使い方
1. 対象リポジトリに移動する
cd /path/to/project
2. .git/info/excludeを開く
vim .git/info/exclude
VS Codeを使う場合は、次のように開けます。
code .git/info/exclude
ファイルやディレクトリが存在しない場合は作成します。
mkdir -p .git/info
touch .git/info/exclude
3. 除外したいパターンを記述する
# 自分専用のメモ
personal-notes.md
# ローカル環境用Docker Compose設定
docker-compose.local.yml
# 検証用ディレクトリ
sandbox/
# 一時ファイル
*.tmp
記法は.gitignoreと同様に、ワイルドカードやディレクトリ指定を利用できます。
よくある利用例
個人用スクリプト
プロジェクト固有の作業を自動化するため、自分だけが使用するスクリプトを置くことがあります。
scripts/my-deploy-check.sh
チームで共有するほどではない場合は、次のように除外できます。
/scripts/my-deploy-check.sh
先頭に/を付けると、リポジトリルートからのパスとして扱われます。
ローカル用Docker Composeファイル
開発者ごとに異なるDocker設定を使う場合があります。
docker-compose.local.yml
/docker-compose.local.yml
ただし、そのファイルが複数のメンバーに必要であれば、.git/info/excludeではなく、プロジェクトの.gitignoreに追加するほうが適切です。
一時的な検証コード
調査やデバッグのために、一時的なファイルを作ることがあります。
debug.php
test-api.py
sandbox/
/debug.php
/test-api.py
/sandbox/
検証ファイルがgit statusに大量表示されるのを防げます。
個人用のタスクランナー設定
プロジェクトでは正式採用されていないものの、自分の作業用として次のようなファイルを置きたいケースもあります。
Justfile
Taskfile.yml
Makefile.local
/Justfile
/Taskfile.yml
/Makefile.local
グローバルignoreとの違い
Gitには、すべてのリポジトリに適用するグローバルな除外設定もあります。
設定されているファイルは、次のコマンドで確認できます。
git config --global --get core.excludesFile
グローバルな除外ファイルを設定する場合は、例えば次のようにします。
git config --global core.excludesFile ~/.config/git/ignore
そして、~/.config/git/ignoreにパターンを記述します。
.DS_Store
Thumbs.db
*.swp
.idea/
ただし、.idea/や.vscode/をグローバルに無視するかどうかは慎重に判断する必要があります。
プロジェクトによっては、IDEの設定ファイルの一部をチームで共有する運用もあるためです。
3種類の使い分け
Gitでファイルを除外する代表的な方法は、次の3つです。
- プロジェクトの
.gitignore - リポジトリ固有の
.git/info/exclude - ユーザー共通のグローバルignore
使い分けの基準は、次のように考えると分かりやすいです。
| 除外したいファイル | 使用する設定 |
|---|---|
| チーム全員に不要なファイル | .gitignore |
| このリポジトリで自分だけ不要なファイル | .git/info/exclude |
| すべてのリポジトリで自分だけ不要なファイル | グローバルignore |
.gitignore
チーム全員が無視すべきファイルに使います。
/node_modules/
/vendor/
.env
/build/
ビルド成果物、依存パッケージ、秘密情報を含むローカル設定などが対象です。
.git/info/exclude
特定プロジェクト内の個人的なファイルに使います。
/local-notes.md
/docker-compose.personal.yml
/sandbox/
グローバルignore
OSやエディタが生成する、自分の環境固有のファイルに使います。
.DS_Store
*.swp
*~
除外されているか確認する
ファイルがどの設定によって除外されているか分からない場合は、git check-ignoreが便利です。
git check-ignore -v personal-notes.md
実行例は次のとおりです。
.git/info/exclude:2:personal-notes.md personal-notes.md
この出力から、次のことが分かります。
- 使用された除外設定ファイル
- パターンが記述されている行番号
- マッチしたパターン
- 対象ファイル
複数の.gitignoreやグローバルignoreを利用している環境では、特に役立ちます。
すでに追跡されているファイルには効かない
.gitignoreや.git/info/excludeは、基本的に未追跡ファイルを対象とする仕組みです。
すでにGitで追跡されているファイルを.git/info/excludeに追加しても、変更内容は引き続きgit statusに表示されます。
例えば、次のファイルがすでにコミットされているとします。
config/local.php
これを.git/info/excludeに追加しても、追跡状態は解除されません。
/config/local.php
追跡を解除するには、通常は次のような操作が必要です。
git rm --cached config/local.php
ただし、この操作は次回のコミットでリポジトリからファイルを削除する変更として扱われます。
共有リポジトリで実行する場合は、チームの運用方針を確認する必要があります。
「追跡済みファイルのローカル変更だけを無視したい」という問題は、.git/info/excludeとは別の話です。
assume-unchangedの代わりにはならない
追跡済みファイルの変更を一時的に目立たなくする方法として、次のコマンドが紹介されることがあります。
git update-index --assume-unchanged config/local.php
解除する場合は次のとおりです。
git update-index --no-assume-unchanged config/local.php
ただし、assume-unchangedは本来、ファイルシステムの性能上の都合から、Gitに変更確認を省略させるための機能です。
ローカル設定ファイルを恒久的に無視する目的で使うと、変更の見落としやマージ時の混乱につながる可能性があります。
プロジェクトの設定ファイルを開発者ごとに変更する必要があるなら、次のような構成を検討したほうが安全です。
config.example.php # Gitで管理する
config.local.php # Gitでは管理しない
.gitignoreには次のように記述します。
/config.local.php
.git/info/excludeを編集する際の注意点
cloneし直すと設定は引き継がれない
.git/info/excludeは各ローカルリポジトリ固有の設定です。
同じリポジトリを別のディレクトリにcloneしても、以前の設定は引き継がれません。
git clone git@example.com:example/project.git project-a
git clone git@example.com:example/project.git project-b
project-a/.git/info/excludeに設定した内容は、project-bには適用されません。
同じ除外設定を何度も追加している場合は、グローバルignoreへの移動を検討できます。
チーム全員に必要なら.gitignoreへ移す
最初は個人的なファイルだと思っていても、実際には複数のメンバーが同じファイルを作成している場合があります。
例えば、全員が次のファイルをローカルで作っているとします。
docker-compose.override.yml
このような場合は、個人の.git/info/excludeではなく、プロジェクトの.gitignoreに追加したほうが安全です。
/docker-compose.override.yml
チーム共通の不要ファイルを各自のローカル設定だけで無視すると、別のメンバーが誤ってコミットする可能性があります。
設定が見えにくい
.gitディレクトリは、エディタやファイルマネージャーで非表示になる場合があります。
その結果、自分で追加した除外設定を忘れてしまうことがあります。
ファイルがgit statusに表示されないときは、次のコマンドで確認できます。
git check-ignore -v path/to/file
また、設定内容を直接確認するには次を実行します。
cat .git/info/exclude
除外ルールの優先順位
Gitは複数の場所から除外パターンを読み込みます。
公式ドキュメントでは、主に次の順序で評価されると説明されています。
- 対応コマンドのコマンドラインから指定されたパターン
- 対象ファイルと同じディレクトリ、または親ディレクトリの
.gitignore .git/info/exclude-
core.excludesFileで指定されたグローバルignore
同じ優先度では、後からマッチしたパターンが優先されます。
通常の運用でこの優先順位を細かく意識する場面は多くありませんが、除外結果が想定と異なる場合はgit check-ignore -vで確認するのが確実です。
便利な追記コマンド
1ファイルだけ素早く除外したい場合は、エディタを開かずに追記できます。
echo '/personal-notes.md' >> .git/info/exclude
ディレクトリを除外する場合は次のとおりです。
echo '/sandbox/' >> .git/info/exclude
重複して追記する可能性がある場合は、確認してから追加します。
grep -qxF '/sandbox/' .git/info/exclude \
|| echo '/sandbox/' >> .git/info/exclude
エイリアスを作る
頻繁に利用する場合は、Gitエイリアスやシェル関数を用意しても便利です。
BashやZshでは、例えば次の関数を設定できます。
git-exclude() {
if [ "$#" -eq 0 ]; then
echo "Usage: git-exclude <pattern>"
return 1
fi
git_dir=$(git rev-parse --git-dir 2>/dev/null) || {
echo "Not a Git repository"
return 1
}
mkdir -p "$git_dir/info"
printf '%s\n' "$1" >> "$git_dir/info/exclude"
echo "Added to $git_dir/info/exclude: $1"
}
使用例です。
git-exclude '/personal-notes.md'
git-exclude '/sandbox/'
git rev-parse --git-dirを利用しているため、通常の.gitディレクトリ構成だけでなく、Git worktreeなどでもGitディレクトリの場所を取得できます。
まとめ
.git/info/excludeは、次のような場合に便利です。
-
.gitignoreを変更したくない - 個人用ファイルをリポジトリ内に置きたい
- 一時的な検証ファイルを
git statusから隠したい - OSSや他社管理のリポジトリをローカルでカスタマイズしたい
- 特定のリポジトリだけに除外設定を適用したい
使い分けを整理すると、次のようになります。
チーム全員で無視する
→ .gitignore
特定リポジトリで自分だけ無視する
→ .git/info/exclude
すべてのリポジトリで自分だけ無視する
→ core.excludesFile
.git/info/excludeは目立たない機能ですが、個人用ファイルによってgit statusが散らかる問題をシンプルに解決できます。
.gitignoreへ追加するほどではないファイルがあるときは、ぜひ利用してみてください。
参考資料
- Marijke Luttekes, “Git exclude, a handy feature you might not know about”
- Git公式ドキュメント「gitignore」