monorepo作っててnode_modules
をrecursiveにignoreする書き方ってrootディレクトリの.gitignore
に
node_moduels/
って書くだけで良いらしい。
知らなかったのでClaudeにsyntax guideを作って貰ったので備忘録。
目次
概要
.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というファイルを無視
パターンの優先順位
- 後に記述されたルールが優先される
- より具体的なパターンが優先される
- 否定パターンは肯定パターンより後に記述する
# 例:優先順位 *.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. 定期的な見直し
- 不要になったパターンを削除
- 新しく必要になったパターンを追加
- パターンの最適化(重複の削除など)