gitで.gitignoreを書かずに無視する方法|3つの使い分け

こんにちは、さるまりんです 🐒🔧

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は慣れないうちは、少し怖く感じることもあります。

でも、こういう小さな仕組みをひとつずつ知っていくと、
「なぜこうするのか」が少しずつ見えてきますね。

読んでくださってありがとうございました。
それではまた!