.git/info/exclude でチームリポジトリを汚さずにローカル専用ファイルを管理する

開発をしていると、「これはチームで共有したくないが、自分用としてはちゃんと管理したいファイル」を置きたくなる場面がある。

例えば、

  • 実験用のコード
  • 一時的な SQL
  • API レスポンスのダンプ
  • 設計途中のメモ
  • 試行錯誤中のスクリプト

といったものだ。

単純に .gitignore に書いてしまう方法もあるが、それを書くこと自体がチームリポジトリを汚している感覚があり、個人的にはずっと違和感があった。


よくあるが微妙な方法

よく見かけるのは次のような構成だ。

project/
├─ src/
├─ docs/
└─ tmp/   ← 自分用

そして .gitignore

/tmp/

と書く。

一見問題なさそうだが、冷静に考えると気持ちが悪い。

  • チーム全員に関係ないディレクトリの存在が .gitignore に残る
  • 「これは何のため?」というノイズが増える
  • 本来ローカルだけの事情なのに、履歴として永続化される

小さなことだが、積み重なると地味にストレスになる。


親リポジトリを一切汚さない方法

結論から言うと、.git/info/exclude を使うのが一番きれい

これは Git に最初から用意されている仕組みで、

  • .gitignore と同じ書き方ができる
  • ローカル環境にしか反映されない
  • commit されない
  • 他のメンバーには一切影響しない

という特徴がある。

要するに、ローカル専用の .gitignore だ。


実際の使い方

まず、プロジェクト直下に自分専用の置き場を作る。

mkdir _private

次に、親リポジトリの以下のファイルを編集する。

.git/info/exclude

ここにだけ、次を追加する。

/_private/

これで終わりだ。

  • 親の .gitignore は一切変更しない
  • _private は Git から完全に無視される
  • 他のメンバーの環境には存在しない

かなりすっきりする。


さらに一歩進める:自分専用でも Git 管理する

単に無視するだけでなく、自分用としては履歴管理したい場合もある。

その場合は、 _private の中で別リポジトリを作る。

cd _private
git init

こうすると、

  • 親プロジェクトとは完全に独立
  • 自分のメモや実験コードを自由に commit できる
  • diff / reset / 履歴管理も可能
  • チームリポジトリには一切影響しない

という状態になる。


最終的な構成イメージ

project-root/
├─ app/
├─ api/
├─ docs/
├─ _private/        ← 自分専用(ローカル ignore)
│  ├─ experiments/
│  ├─ memo.md
│  └─ .git/         ← 自分用リポジトリ
└─ .git/

この構成にしてから、

  • 「とりあえず置く場所」に悩まなくなった
  • 実験や検証の心理的ハードルが下がった
  • チームに対して余計な気遣いをしなくて済む

という効果を感じている。


まとめ

  • チームに共有しないファイルは .gitignore に書かなくていい
  • ローカル限定の ignore には .git/info/exclude を使う
  • 管理したければディレクトリ単位で別 Git リポジトリを切る

小さな工夫だが、分かっているとかなり気持ちよくなる Git 運用だと思う。