JavaScriptをがんばるブログ

React,OSS,ソフトウェア開発が中心のブログです👨‍💻

.gitignore構文ガイド

monorepo作っててnode_modulesをrecursiveにignoreする書き方ってrootディレクトリの.gitignore

node_moduels/

って書くだけで良いらしい。
知らなかったのでClaudeにsyntax guideを作って貰ったので備忘録。

目次

  1. 概要
  2. 基本構文
  3. パターンマッチング
  4. グロブパターン
  5. 否定パターン
  6. ディレクトリの扱い
  7. コメント
  8. パターンの優先順位
  9. 実践例
  10. よくある使用例
  11. トラブルシューティング
  12. ベストプラクティス

概要

.gitignoreは、Gitのバージョン管理から除外したいファイルやディレクトリを指定するための設定ファイルです。このファイルに記載されたパターンにマッチするファイルは、Gitによって無視されます。

基本的な仕組み

  • リポジトリのルートディレクトリに配置(サブディレクトリにも配置可能)
  • 1行に1つのパターンを記述
  • 上から順に評価される
  • 後から記述されたルールが優先される

基本構文

単純なファイル名指定

# 特定のファイルを無視
config.json
secret.txt

ワイルドカード

# すべての.logファイルを無視
*.log

# tempで始まるすべてのファイルを無視
temp*

# .cacheで終わるすべてのファイルを無視
*.cache

パターンマッチング

パスの指定方法

相対パス

# .gitignoreファイルからの相対パス
src/config.json
build/output.txt

絶対パス(スラッシュ始まり)

# リポジトリルートからのパス
/config.json      # ルートのconfig.jsonのみ
/build/           # ルートのbuildディレクトリのみ

どこでもマッチ

# ディレクトリ階層に関係なくマッチ
config.json       # すべてのconfig.jsonファイル
*.log            # すべての.logファイル

グロブパターン

基本的なグロブパターン

アスタリスク(*)

# 0文字以上の任意の文字列にマッチ(スラッシュを除く)
*.txt            # すべての.txtファイル
test_*.py        # test_で始まる.pyファイル
*_backup         # _backupで終わるファイル

クエスチョンマーク(?)

# 任意の1文字にマッチ
?.txt            # a.txt, b.txt など
file?.log        # file1.log, file2.log など

ブラケット([])

# 指定した文字のいずれか1文字にマッチ
file[0-9].txt    # file0.txt〜file9.txt
log[abc].txt     # loga.txt, logb.txt, logc.txt
file[!0-9].txt   # file + 数字以外の1文字 + .txt

ダブルアスタリスク(**)

# ディレクトリの階層を越えてマッチ
**/logs          # すべての階層のlogsディレクトリ
logs/**          # logsディレクトリ内のすべて
**/logs/*.log    # すべての階層のlogs内の.logファイル
a/**/b           # a/b, a/x/b, a/x/y/b など

否定パターン

エクスクラメーション(!)で始まるパターンは、無視設定を取り消します。

# すべての.logファイルを無視
*.log

# ただしimportant.logは無視しない
!important.log

# buildディレクトリを無視
build/

# ただしbuild/keep/は無視しない
!build/keep/

否定パターンの注意点

# ディレクトリが無視されると、その中のファイルは復活できない
logs/            # logsディレクトリを無視
!logs/keep.log   # これは効かない(親ディレクトリが無視されているため)

# 正しい方法
logs/*           # logs内のすべてを無視
!logs/keep.log   # keep.logは無視しない

ディレクトリの扱い

ディレクトリの指定

# スラッシュで終わる = ディレクトリのみ
build/           # buildディレクトリのみ(buildファイルは無視しない)
temp/            # tempディレクトリのみ

# スラッシュなし = ファイルとディレクトリ両方
build            # buildという名前のファイルもディレクトリも無視

ディレクトリ内のファイル

# ディレクトリ内のすべてを無視
logs/*

# 特定の階層のみ
src/*/test/      # src直下の各ディレクトリ内のtestディレクトリ

コメント

# これはコメントです
# ハッシュ(#)で始まる行はコメントとして扱われます

# バックスラッシュでエスケープ可能
\#filename.txt   # #filename.txtというファイルを無視

パターンの優先順位

  1. 後に記述されたルールが優先される
  2. より具体的なパターンが優先される
  3. 否定パターンは肯定パターンより後に記述する
# 例:優先順位
*.log            # すべての.logを無視
!important.log   # important.logは無視しない
error.log        # error.logは無視する(最後のルールが優先)

実践例

Node.jsプロジェクト

# 依存関係
node_modules/
npm-debug.log*
yarn-error.log*

# 環境変数
.env
.env.local
.env.*.local

# ビルド出力
dist/
build/
*.bundle.js

# エディタ設定
.vscode/
.idea/
*.swp
*.swo
*~

# OS生成ファイル
.DS_Store
Thumbs.db

Pythonプロジェクト

# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# 仮想環境
venv/
env/
ENV/

# 配布/パッケージング
dist/
build/
*.egg-info/
*.egg

# テストカバレッジ
.coverage
.pytest_cache/
htmlcov/

# Jupyter Notebook
.ipynb_checkpoints

一般的なWebプロジェクト

# ログファイル
logs/
*.log

# 依存関係
vendor/
bower_components/

# ビルド成果物
dist/
build/
public/assets/

# 設定ファイル(機密情報を含む)
config/database.yml
config/secrets.yml
.env

# アップロードファイル
uploads/
public/uploads/

# キャッシュ
.cache/
tmp/

よくある使用例

特定の拡張子をすべて無視(例外あり)

# すべての.tmpファイルを無視
*.tmp

# ただしkeep.tmpは無視しない
!keep.tmp

特定ディレクトリ内の特定ファイルのみ追跡

# configディレクトリ内をすべて無視
config/*

# ただしdefaults.jsonは追跡
!config/defaults.json

ネストしたディレクトリの扱い

# すべてのbuildディレクトリを無視
**/build/

# src配下のtestディレクトリのみ無視
src/**/test/

空のディレクトリを保持

# 空のディレクトリを保持するため.gitkeepを使用
uploads/*
!uploads/.gitkeep

トラブルシューティング

すでに追跡されているファイルを無視する

# ファイルがすでにGitに追跡されている場合
git rm --cached filename.txt
git commit -m "Remove filename.txt from tracking"

# ディレクトリの場合
git rm -r --cached directory_name/
git commit -m "Remove directory from tracking"

.gitignoreが効かない場合

# キャッシュをクリア
git rm -r --cached .
git add .
git commit -m "Clear git cache"

パターンのデバッグ

# 特定のファイルがなぜ無視されるか確認
git check-ignore -v filename.txt

# すべての無視されるファイルを表示
git status --ignored

ベストプラクティス

1. 明確で理解しやすいパターンを使用

# 良い例:明確
*.log
config/*.local.json

# 悪い例:複雑すぎる
**/[a-z]*/*.[!t][!x][!t]

2. コメントを活用

# === Development ===
*.log
*.tmp

# === Dependencies ===
node_modules/
vendor/

# === IDE ===
.vscode/
.idea/

3. グローバル.gitignoreの活用

# グローバル設定
git config --global core.excludesfile ~/.gitignore_global

グローバル.gitignoreの例:

# OS generated files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db

# Editor files
*~
*.swp
*.swo
.idea/
.vscode/

4. プロジェクト固有とグローバルの使い分け

  • プロジェクト.gitignore: プロジェクト固有のファイル(build/, node_modules/など)
  • グローバル.gitignore: 個人の環境固有のファイル(.DS_Store, .vscode/など)

5. テンプレートの活用

GitHubが提供するgitignore テンプレートを参考に、プロジェクトに適したものを選択して使用します。

6. 定期的な見直し

  • 不要になったパターンを削除
  • 新しく必要になったパターンを追加
  • パターンの最適化(重複の削除など)