こんにちは、さるまりんです 🐒🔧
gitを使っていると、
- 「これ、無視したいけど
.gitignoreに書きたくない…」 - 「自分だけ無視したい」
- 「もう管理されているけど、変更を追いたくない」
こんな場面に出会うことがあります。
実はgitには、.gitignore 以外にも
ファイルを無視する方法がいくつかあります。
今回はその中でも、実務で使うことがありそうな3つを整理してみます。
■ 結論:無視する方法は3つある
gitでファイルを無視する方法は、主にこの3つです。
| 方法 | 特徴 |
|---|---|
.git/info/exclude |
ローカルだけ無視する |
| global ignore | すべてのリポジトリで共通して無視する |
| assume-unchanged | すでにgit管理されているファイルの変更検知を抑える |
ポイントは、
「誰に影響させるか」と「そのファイルがすでにgit管理されているか」
です。
■ .git/info/exclude(ローカル限定)
まずはこれです。
.git/info/exclude
このファイルに書いた内容は、.gitignore と同じように扱われます。
# 例
.env
*.log
■ 特徴
.gitignoreと同じ書き方ができる- git管理されない
- 自分のローカル環境だけで有効
■ 使う場面
- エディタの設定ファイル
- 個人用の
.env - 一時的に作成されるファイル
「チームに影響させたくないけれど、自分の環境では無視したい」
というときに使えます。
.gitignore に書くと、基本的にはチーム全体で共有されます。
一方で、.git/info/exclude はそのリポジトリの自分の環境だけに効くので、
個人用の設定をそっと避けたいときに便利です。
■ global ignore(全体共通)
次は、グローバルな除外設定です。
よく見る設定方法は、次のような形です。
git config --global core.excludesFile ~/.gitignore_global
そして、指定したファイルを作ります。
touch ~/.gitignore_global
中身はこんな感じです。
.DS_Store
Thumbs.db
*.swp
■ 特徴
- すべてのリポジトリに適用される
- OSやエディタ依存のファイルをまとめて無視できる
■ 使う場面
- Macの
.DS_Store - Windowsの
Thumbs.db - Vimの
.swp - エディタやツールが自動生成する一時ファイル
「どのプロジェクトでも不要なもの」 は、ここに書いておくと便利です。
■ デフォルトの global ignore の場所
公式のマニュアルを見ると、core.excludesFile にはデフォルト値があります。
core.excludesFile を自分で設定していない場合は、
$XDG_CONFIG_HOME/git/ignore
が使われます。
そして、$XDG_CONFIG_HOME が設定されていない場合は、
$HOME/.config/git/ignore
が使われます。
つまり、多くの環境では次の場所に書いておけば、グローバルなignoreとして使えるということです。
~/.config/git/ignore
ファイルがなければ、作成しておきます。
mkdir -p ~/.config/git
touch ~/.config/git/ignore
そして、たとえば次のように書きます。
.DS_Store
Thumbs.db
*.swp
個人的には、特別な理由がなければ
~/.config/git/ignore を使う形でもよさそうだと感じました。
ホームディレクトリ直下に .gitignore_global を増やさなくて済むので、少しすっきりしますね。
■ assume-unchanged(既存ファイルの変更検知を抑える)
ここが少しクセのあるところです。
git update-index --assume-unchanged ファイル名
例えば、次のように使います。
git update-index --assume-unchanged .env
■ 何が起きるか
指定したファイルについて、gitが変更を検知しにくくなります。
ざっくり言うと、
「このファイルは変わっていないものとして扱ってね」
とgitに伝えるイメージです。
■ 元に戻す方法
元に戻す場合は、次のコマンドを使います。
git update-index --no-assume-unchanged ファイル名
例えばこうです。
git update-index --no-assume-unchanged .env
■ assume-unchanged の状態を確認する
どのファイルに assume-unchanged が付いているか確認したい場合は、次のようにします。
git ls-files -v
この結果の中で、先頭が小文字の h になっているものが、
assume-unchanged の対象です。
絞り込むなら、次のようにも書けます。
git ls-files -v | grep '^h'
■ assume-unchanged の注意点
assume-unchanged は便利ですが、少し注意が必要です。
これは .gitignore のように、ファイルを完全に無視する仕組みではありません。
どちらかというと、
「すでにgit管理されているファイルについて、変更確認を省略する」
ためのものです。
そのため、
- 新規ファイルを無視する用途には向いていない
- すでにgit管理されているファイルに使う
- 使ったことを忘れると、変更が反映されずに迷うことがある
- pullやmergeのときに、状況によっては競合やエラーになることがある
という点には注意が必要です。
特にチーム開発では、
「自分だけ設定を変えたいから」という理由で安易に使うと、あとで混乱することがあります。
使う場合は、
一時的な対応として使う
使ったら戻し方も覚えておく
くらいの気持ちがよさそうです。
■ .gitignore / exclude / global ignore は、基本的に未追跡ファイル向け
ここも大事です。
.gitignore や .git/info/exclude、global ignore は、
基本的には まだgit管理されていないファイル を対象にするものです。
すでにgit管理されているファイルは、あとから .gitignore に書いても、
そのままでは無視されません。
たとえば、すでに .env をgit管理している場合、
あとから .gitignore に .env と書いても、変更は追跡され続けます。
その場合は、管理対象から外す必要があります。
git rm --cached .env
ただし、この操作はチームにも影響する可能性があります。
実務では、勝手にやるのではなく、
「このファイルは本当にgit管理から外してよいか」を確認してから進めるのが安全です。
■ どれを使うべきか
ここが一番大事です。
ざっくり、こう考えると整理しやすいです。
| 状況 | 使う方法 |
|---|---|
| チーム全体で無視したい | .gitignore |
| 自分だけ無視したい | .git/info/exclude |
| どのプロジェクトでも不要 | global ignore |
| すでに管理されているファイルの変更検知を抑えたい | assume-unchanged |
もう少し言うと、
「チームに共有すべき設定か?」
「自分の環境だけの話か?」
「そのファイルはすでにgit管理されているか?」
この3つで判断するとよさそうです。
■ まとめ
gitで無視する方法は、.gitignore だけではありません。
- チームで共有するなら
.gitignore - ローカルだけなら
.git/info/exclude - 全リポジトリ共通なら global ignore
- 既存ファイルの変更検知を抑えるなら assume-unchanged
それぞれ役割が違います。
状況によって使い分けることで、
- 無駄な差分を減らす
- チームの混乱を防ぐ
- 自分の作業環境を整えやすくする
ことができます。
■ さるまりんのひとこと 🐒🔧
.gitignore に何でもかんでも書いてしまうと、
「これは本当に共有すべきものなのか?」
が見えにくくなることがあります。
ローカルで閉じるのか、チームで共有するのか。
この視点を持っておくだけで、
gitの使い方が少し整理されてくると思います。
gitは慣れないうちは、少し怖く感じることもあります。
でも、こういう小さな仕組みをひとつずつ知っていくと、
「なぜこうするのか」が少しずつ見えてきますね。
読んでくださってありがとうございました。
それではまた!