はじめに:なぜウチのチームの .gitignore は「汚い」のか
たまに .gitignore をメンテすると、.gitignoreって秩序がなく読みにくいなと思います笑
.env
.idea/*
.composer
.php-cs-fixer.cache
.phpunit.cache
.htpasswd
vendor
node_modules/*
public_html/images/tmp*
junit.xml
coverage.xmlCode language: plaintext (plaintext)
なぜ、ひどくなってしまうのでしょうか?おそらく次のような対応の積み重ねの結果だと思います。
- ディレクトリ構造をしっかりと設計していない:上の .env を例にすると、./configs/.env に置くかも?、./.env に置くかも?どれにも対応できるようにファイル名だけで除外したかもしれません。
- 後追い対応:誤ってコミットしてから、あわてて末尾に 1 行足す。
- オーナーシップの欠如:誰かが書いた設定を壊すのが怖いので整理しない。とりあえず末尾に足していく。
ポリシーの提案:2つのブロックで考える
1. 自分のアプリケーションが定義した構造
先頭スラッシュありで指定します。
- 依存関係(/vendor/)
- PHP composer用です。CIで composer install してからデプロイします。
- 設定ファイル(/configs/.env, /configs/.htpasswd)
- CIで環境変数やSecretsからファイル保存されます。ローカルの開発環境では、.env.example をコピペして手作業で編集して使います。これらのファイルは commit しません。
- 開発環境の一時ファイル(/node_modules/, /public_html/images/tmp*)
- /node_modules/ はJSビルド、CSSビルド用であり、本番環境にはデプロイしません。/node_modules/ も依存関係ですが、/vendor/ の依存関係とはニュアンスが少し違います。
- /public_html/images/tmp* は一時的なアップロードファイルやテスト画像です。
外部ツールが勝手に作るもの
どこにあっても除外したいので、先頭スラッシュなしで指定します。
- IDE、エディタ(
.idea)- これらは基本的にルートに置かれますが、もしサブディレクトリで作業して誤って生成されたとしても、リポジトリに混入してほしくないものです。
- 各種ツールのキャッシュ・設定(
.composer,.php-cs-fixer.cache,.phpunit.cache, ...)- これらは「どこにあってもゴミ」なので、スラッシュなしが一般的です。
- テスト・解析レポート(
junit.xml,coverage.xml)- これらはCI環境やテスト実行時に生成される成果物です。誤って別の階層でテストを走らせてしまった場合でも、リポジトリを汚さないようにスラッシュなしが一般的です。
【実践】メンテナブルなセクション構成(改善後)
# --- [ 厳格に場所を固定したいもの ] ---
# 1. 依存関係
/vendor/
# 2. 設定ファイル
/configs/.env
/configs/.htpasswd
# 3. 開発環境の一時ファイル
/node_modules/
/public_html/images/tmp*
# --- [ どこにあっても無視したいもの ] ---
# IDE、エディタ
.idea/
# 各種ツールのキャッシュ・設定
.composer/
.php-cs-fixer.cache
.phpunit.cache
# テスト・解析レポート
coverage.xml
junit.xml
Code language: plaintext (plaintext)
なぜ「パスを明示する」ことが重要なのか
改善後の .gitignore はきれいで読みやすくなりました。それは「意図(セマンティクス)」が明確だからです。
- 「開発チームが設計したディレクトリ(構造)」を守るためのスラッシュあり。
- 「ツールが勝手に置くゴミ(環境)」を掃き出すためのスラッシュなし。
この 2 つの視点(ポリシー)があるだけで、今後新しいファイルが増えても「どこに入れるべきか」に迷いがなくなります。
特に、特定のディレクトリ配下の秘匿情報を除外する場合、スラッシュ / を使ってパスを明示したほうが安全だと考えます。
/configs/.env (スラッシュあり) プロジェクトルートの configs ディレクトリ直下にある .env だけを除外します。また『このプロジェクトの設定は configs の中にあるんですよ』という宣言でもあります。セットで .env.example をリポジトリに置いておけば、環境構築で迷う人は一人もいなくなります。
.env (スラッシュなし) プロジェクト内のあらゆる場所にある .env を除外します。 (例:もしテスト用に tests/fixtures/.env をあえてコミットしたくても、この書き方だと除外されてしまいます)
実は /configs/.env(先頭スラッシュあり) と configs/.env(先頭スラッシュなし) は同じ意味です。しかし、あえて先頭に / をつけることで、『これはプロジェクト構造のファイルだ』ということが強調されます。逆に、どこにあっても無視したいツール系のゴミにはスラッシュをつけない。この使い分けこそが、メンテナブルな設定の鍵だと考えます。
ややこしいことに、 vendor/ と /vendor/ は違う意味です。
まとめ:清潔な .gitignore は、清潔な開発の第一歩
「スラッシュなしの .env」は、「プロジェクト内のどこにあってもその名前のファイルを除外する」 という指定です。これは間違いではありませんが、スラッシュなしよりも、アプリケーションのディレクトリ構造を意識して「パスを指定して、意図しない除外やコミット漏れを防ぐ」 書き方をするほうが「清潔な管理」への近道です。
整理された .gitignore がリポジトリにあると、新しくプロジェクトに加わる人(あるいは未来の自分)も、「あ、このプロジェクトはちゃんと管理されているな」と襟を正すようになります。
誰も気にしない .gitignore まで磨き上げられているプロジェクトは、コードの品質も信頼できる。割れ窓を塞ぐのは、こうした小さな 1 行の整理からだと信じています。
参考リソース
- git-scm (.gitignore公式ドキュメント): スラッシュの挙動など、文法の正確な確認に。
- GitHub gitignore テンプレート: 一般的な「ツール由来の除外設定」の標準を知るために。

