.gitignoreは、Gitリポジトリで追跡(トラッキング)したくないファイルやディレクトリを指定するための設定ファイルです。このファイルに記述されたパターンに一致するファイルは、Gitの管理対象から除外され、git statusやgit addなどのコマンドで表示されなくなります。
なぜ.gitignoreが必要なのか
Gitリポジトリを管理する際、以下のようなファイルをコミットしたくない場合が多くあります:
-
依存関係のパッケージ:
node_modules/、vendor/など、パッケージマネージャーでインストールされるファイル -
ビルド成果物:
dist/、build/、.next/など、ソースコードから生成されるファイル -
環境変数ファイル:
.env、.env.localなど、機密情報を含む可能性のある設定ファイル -
ログファイル:
*.log、npm-debug.log*など、実行時に生成される一時的なファイル -
OS固有のファイル:
.DS_Store(macOS)、Thumbs.db(Windows)など、OSが自動生成するファイル -
IDE・エディタの設定:
.vscode/、.idea/など、開発環境に依存する設定ファイル -
テストカバレッジレポート:
coverage/など、テスト実行時に生成されるファイル
これらのファイルをコミットしてしまうと、以下のような問題が発生します:
- リポジトリサイズの肥大化: 不要なファイルが含まれることで、リポジトリが大きくなり、クローンやプッシュに時間がかかる
- マージコンフリクトの増加: 自動生成されるファイルが原因で、不要なコンフリクトが発生する
- セキュリティリスク: 機密情報を含むファイルが誤ってコミットされる可能性がある
- 開発環境の汚染: 他の開発者の環境固有の設定が混入する
.gitignoreを適切に設定することで、これらの問題を防ぐことができます。
このガイドについて
このドキュメントは、.gitignoreの仕様を理解し、実践的な場面で効果的に活用するための完全ガイドです。以下の内容を網羅しています:
-
基本仕様:
.gitignoreの動作原理とパターンの解釈方法 -
高度な機能: ワイルドカード、否定パターン(
!)などの活用方法 - 実践的なユースケース: よくあるシナリオとその解決方法
- チートシート: よく使うパターンの早見表
- トラブルシューティング: よくある問題とその解決法
-
テンプレート生成ツール: 効率的に
.gitignoreを作成する方法
対象読者
このガイドは、以下のような方々を対象としています:
- Gitを初めて使う初心者の方
-
.gitignoreの基本的な使い方は知っているが、より高度な使い方を学びたい方 - 特定のユースケースで
.gitignoreを設定したいが、適切なパターンがわからない方 -
.gitignoreに関する問題に遭遇し、解決方法を探している方
前提知識
このガイドを理解するために、以下の知識があると役立ちます:
- Gitの基本的なコマンド(
git add、git commit、git statusなど) - ファイルパスとディレクトリ構造の理解
- 正規表現やワイルドカードの基本的な概念(必須ではありませんが、理解が深まります)
このガイドの使い方
- 初心者の方: 「基本仕様」から順に読み進めることをおすすめします
- 特定の目的がある方: 「実践的なユースケース」や「チートシート」から必要な部分を参照してください
- 問題に直面している方: 「よくある問題と解決法」を確認してください
- テンプレートを使いたい方: 「テンプレート生成サイト」のセクションを参照してください
それでは、.gitignoreの世界を一緒に探索していきましょう。
基本仕様
.gitignoreの配置
-
.gitignoreは複数のディレクトリに置くことができる - 深い階層の
.gitignoreに書かれた指定の方が優先順位が高い(後に解釈される) -
.gitignoreはそこから下のディレクトリにしか影響を及ぼせない - Gitリポジトリのルート、あるいはOSのルートからの絶対パス指定はできない
パターンの解釈順序
.gitignore内の記述は上の行から順に以下のように解釈される:
1. /を含まない行(fileなど)
.gitignore以下の全サブディレクトリ下にあるこの名前のファイル or ディレクトリを無視する
file
→ file、directory/file、a/b/c/file など、すべての階層のfileを無視
2. 末尾以外にのみ/を含む行(/file、/path/to/file、path/to/fileなど)
.gitignoreが置いてあるディレクトリをカレントディレクトリとする相対パスで指定されるファイル or ディレクトリを無視する
/file
/path/to/file
path/to/file
→ .gitignoreと同じ階層のfile、または指定されたパスのファイルのみを無視
3. 末尾だけ/な行(directory/など)
.gitignore以下の全サブディレクトリ下にあるこの名前のディレクトリを無視する
directory/
→ directory/、a/directory/、a/b/directory/ など、すべての階層のdirectoryを無視
4. 末尾以外にも末尾にも/を含む行(/directory/、/path/to/directory/、path/to/directory/など)
.gitignoreが置いてあるディレクトリをカレントディレクトリとする相対パスで指定されるディレクトリを無視する
/directory/
/path/to/directory/
path/to/directory/
→ .gitignoreと同じ階層のdirectory、または指定されたパスのディレクトリのみを無視
5. !で始まる行(!/path/to/fileなど)
!以降のパターン文字列が示すファイル or ディレクトリを無視しない(前の無視指定を上書き)
!file
!/path/to/file
6. 空行 or #で始まる行
解釈されない(コメントとして扱われる)
ワイルドカード
*
/以外の0文字以上の文字列にマッチ
*.log # すべての.logファイル
*.o # すべての.oファイル
test* # testで始まるファイル
*test # testで終わるファイル
?
/以外の1文字にマッチ
file?.txt # file1.txt, fileA.txt など
[0-9]など
/以外の指定した1文字にマッチ
file[0-9].txt # file0.txt ~ file9.txt
file[abc].txt # filea.txt, fileb.txt, filec.txt
**
0個以上のファイル or ディレクトリにマッチ(Git 1.8.2以降で使用可能)
/a/** # /a, /a/x, /a/x/y など
/**/b # /b, /x/b, /x/y/b など
/a/**/b # /a/b, /a/x/b, /a/x/y/b など
**/*.log # すべての階層の.logファイル
エスケープ
\(バックスラッシュ)でエスケープできる
\#*# # Emacsの自動保存ファイル(#*#)を無視
否定パターン(!)の使い方
基本
!で始まる行は、前の無視指定を上書きして、そのファイルやディレクトリを無視しないようにする。
重要: 否定パターンは、既に無視されているパターンに対してのみ有効。まだ無視されていないパターンに対して!を使っても意味がない。
使用例
例1: 特定のファイルだけ除外
# すべての.logファイルを無視
*.log
# ただし、important.logは無視しない
!important.log
例2: ディレクトリ内の特定ファイルだけ除外
# tmpディレクトリ内のすべてを無視
/tmp/*
# ただし、.gitkeepは無視しない
!/tmp/.gitkeep
例3: 複数階層での除外
# logsディレクトリ内のすべてを無視
/logs/**
# ただし、logs/production/は無視しない
!/logs/production/
# logs/production/内のすべてを無視
/logs/production/**
# ただし、logs/production/app.logは無視しない
!/logs/production/app.log
実践的なユースケース
ユースケース1: 子ディレクトリの直下のファイルはignoreしたいが、子ディレクトリ自体はignoreしない
シナリオ: src/components/以下の各ディレクトリ内の.test.tsファイルは無視したいが、ディレクトリ自体は保持したい
# src/components/以下のすべての.test.tsファイルを無視
src/components/**/*.test.ts
# ディレクトリ自体は無視しない(通常は自動的に保持される)
別パターン: 特定のディレクトリ構造を保持しつつ、その中のファイルだけ無視
# src/temp/以下のすべてのファイルを無視
src/temp/**
# ただし、src/temp/ディレクトリ自体は保持(.gitkeepで管理)
!src/temp/.gitkeep
ユースケース2: 特定のディレクトリのみ除外して、その他の子ディレクトリは無視
シナリオ: build/以下のすべてを無視したいが、build/docs/だけは保持したい
# build/以下のすべてを無視
/build/**
# ただし、build/docs/は無視しない
!/build/docs/
# build/docs/以下のすべてを保持
!/build/docs/**
ユースケース3: ネストされた除外パターン
シナリオ: tmp/内のすべてを無視したいが、tmp/deep/directory/.gitkeepだけは保持したい
/tmp/*
!/tmp/deep/
/tmp/deep/*
!/tmp/deep/directory/
/tmp/deep/directory/*
!/tmp/deep/directory/.gitkeep
注意: ディレクトリを無視した場合(/tmp/)、その中の一部だけを除外することはできない。そのため、/tmp/*でファイルやディレクトリを無視し、必要なパスを段階的に除外する必要がある。
ユースケース4: 拡張子は無視するが、特定のファイル名は保持
シナリオ: すべての.tmpファイルを無視したいが、important.tmpだけは保持したい
*.tmp
!important.tmp
ユースケース5: 環境変数ファイルの管理
シナリオ: .envファイルは無視したいが、.env.exampleは保持したい
.env
.env.local
.env.*.local
!.env.example
ユースケース6: ビルド成果物は無視するが、設定ファイルは保持
シナリオ: dist/内のビルド成果物は無視したいが、dist/config.jsonは保持したい
/dist/*
!/dist/config.json
ユースケース7: ログファイルは無視するが、重要なログは保持
シナリオ: logs/内のすべてのログを無視したいが、logs/error.logは保持したい
logs/*.log
!logs/error.log
ユースケース8: テストカバレッジは無視するが、サマリーは保持
シナリオ: coverage/内の詳細レポートは無視したいが、coverage/coverage-summary.jsonは保持したい
/coverage/**
!/coverage/coverage-summary.json
ユースケース9: 一時ファイルは無視するが、ディレクトリ構造は保持
シナリオ: cache/内のファイルは無視したいが、ディレクトリ構造は保持したい
/cache/**
!/cache/
!/cache/**/.gitkeep
ユースケース10: 特定のパターンに一致するファイルだけ除外
シナリオ: *.min.jsは無視したいが、vendor.min.jsだけは保持したい
*.min.js
!vendor.min.js
チートシート
パターン記法の早見表
| パターン | 意味 | 例 |
|---|---|---|
file |
すべての階層のfileを無視 |
file, dir/file, a/b/file
|
/file |
ルートのfileのみ無視 |
/fileのみ |
file/ |
すべての階層のfileディレクトリを無視 |
file/, dir/file/
|
/file/ |
ルートのfileディレクトリのみ無視 |
/file/のみ |
path/to/file |
相対パスのfileを無視 |
path/to/file |
*.ext |
すべての.extファイルを無視 |
a.ext, dir/b.ext
|
**/*.ext |
すべての階層の.extファイルを無視 |
a.ext, deep/nested/file.ext
|
!pattern |
パターンを無視しない | !important.log |
# comment |
コメント | 解釈されない |
よく使うパターン集
# 依存関係
node_modules/
vendor/
.pnp
.pnp.js
# ビルド成果物
dist/
build/
out/
.next/
*.tsbuildinfo
# ログファイル
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
# 環境変数
.env
.env.local
.env.development.local
.env.test.local
.env.production.local
.env*.local
# テストカバレッジ
coverage/
*.lcov
.nyc_output
# IDE・エディタ
.vscode/
.idea/
*.swp
*.swo
*~
.DS_Store
# OS固有
Thumbs.db
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
# 一時ファイル
*.tmp
*.temp
.cache/
tmp/
temp/
言語・フレームワーク別テンプレート
Node.js / JavaScript
node_modules/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnp
.pnp.js
coverage/
.nyc_output
*.log
.env
.env.local
.DS_Store
Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
env/
venv/
ENV/
.venv
pip-log.txt
pip-delete-this-directory.txt
.pytest_cache/
.coverage
htmlcov/
*.egg-info/
dist/
build/
Java
*.class
*.log
*.jar
*.war
*.ear
*.zip
*.tar.gz
*.rar
target/
.gradle/
build/
.idea/
*.iml
Go
*.exe
*.exe~
*.dll
*.so
*.dylib
*.test
*.out
go.work
vendor/
Rust
target/
Cargo.lock
**/*.rs.bk
*.pdb
よくある問題と解決法
問題1: .gitignoreという名前のファイルを作れない(Windows)
原因: Windowsのエクスプローラーやメモ帳では、.で始まる名前のファイルを作るとエラーになる
解決法:
- ファイル名を
.gitignore.とする(末尾に.を追加) - EmEditorなど、
.で始まる名前のファイルを作れるテキストエディタを使う - コマンドプロンプトで
type nul > .gitignoreを実行
一度ファイルを作ってしまえば、あとは普通に編集できる。
問題2: .gitignoreに追加したのに無視されない
原因: 以前にgit addでインデックスに登録していたり、既にコミットしている
解決法:
# ファイルを手元に残したまま、Gitの管理から外す
git rm --cached path/to/file
# ディレクトリの場合
git rm --cached -r path/to/directory
# ファイルを手元からも削除する場合
git rm path/to/file
git rm -r path/to/directory
--cachedオプションの違い:
-
--cachedあり: Gitの管理対象から外れるが、手元には残る -
--cachedなし: Gitの管理対象から外れ、手元からも削除される
問題3: ディレクトリを無視した後、特定のファイルだけ除外できない
原因: Gitはパフォーマンス上の理由から、ディレクトリを無視した場合、その中の一部だけを除外できないという制限がある
解決法: ディレクトリではなく、ディレクトリ内のファイルやディレクトリを無視する
# ❌ 間違い
/tmp/
!/tmp/.gitkeep
# ✅ 正解
/tmp/*
!/tmp/.gitkeep
問題4: Thumbs.dbや.DS_Storeを.gitignoreに入れるべきか
推奨: プロジェクト固有の.gitignoreには入れず、global .gitignoreに設定する
理由:
-
.gitignoreはプロジェクト固有の無視設定を記録する場所 - OS固有のファイルは開発者個人の環境に依存する
- すべての環境に対応するのは現実的に不可能
global .gitignoreの設定:
# Git 1.7.12以降はデフォルトで ~/.config/git/ignore が使用される
# 手動で設定する場合
git config --global core.excludesfile ~/.gitignore_global
~/.config/git/ignore または ~/.gitignore_global に以下を記述:
# OS固有ファイル
.DS_Store
Thumbs.db
desktop.ini
おすすめの書き方
基本原則
-
特定の拡張子を無視する場合: どこにも
/を付けない*.o -
特定のファイルを無視する場合: 先頭に
/を付ける/npm-debug.log -
特定のディレクトリを無視する場合: 先頭と末尾に
/を付ける/bin/
構造化された.gitignoreの例
# ============================================
# 依存関係
# ============================================
node_modules/
vendor/
.pnp
# ============================================
# ビルド成果物
# ============================================
dist/
build/
out/
.next/
# ============================================
# ログファイル
# ============================================
*.log
npm-debug.log*
# ============================================
# 環境変数
# ============================================
.env
.env.local
!.env.example
# ============================================
# テスト
# ============================================
coverage/
.nyc_output
# ============================================
# IDE・エディタ
# ============================================
.vscode/
.idea/
*.swp
# ============================================
# OS固有(プロジェクト固有の場合のみ)
# ============================================
# 注意: 通常はglobal .gitignoreに設定すべき
.DS_Store
Thumbs.db
テンプレート生成サイト
1. gitignore.io
URL: https://www.toptal.com/developers/gitignore
特徴:
- 言語、フレームワーク、IDE、OSを選択してテンプレートを生成
- コマンドラインからも使用可能
- 複数のテンプレートを組み合わせ可能
使い方:
https://www.toptal.com/developers/gitignore/api/node,react,nextjs
コマンドライン:
curl https://www.toptal.com/developers/gitignore/api/node,react,nextjs
2. GitHub gitignore テンプレート
URL: https://github.com/github/gitignore
特徴:
- GitHub公式のgitignoreテンプレート集
- 言語、フレームワーク、IDE、OS別に豊富なテンプレート
- オープンソースで継続的に更新
使い方:
- リポジトリをクローンまたはブラウザで閲覧
- 該当するテンプレートファイルをコピー
- 必要に応じてカスタマイズ
3. gitignore.io (別サイト)
特徴:
- シンプルなUIでテンプレートを生成
- 検索機能付き
- コマンドライン統合可能
4. Visual Studio Code 拡張機能
拡張機能名: .gitignore Generator
特徴:
- VS Code内で直接テンプレートを生成
- 複数のテンプレートを組み合わせ可能
- プロジェクトに直接追加可能
5. JetBrains IDE プラグイン
プラグイン名: .ignore
特徴:
- IntelliJ IDEA、WebStormなどで使用可能
-
.gitignore、.dockerignoreなどに対応 - テンプレートの自動補完
.gitignoreを効果的に使うためのポイント:
-
パターンの優先順位を理解する: 深い階層の
.gitignoreが優先される -
/の使い分け: ルートのみ vs すべての階層 -
否定パターン(
!)の活用: 無視したパターンから特定のファイルを除外 - ディレクトリ無視の制限: ディレクトリを無視した場合、中の一部だけを除外できない
- global .gitignoreの活用: OS固有のファイルは個人設定で管理
- テンプレートサイトの活用: 既存のテンプレートをベースにカスタマイズ
このガイドを参考に、プロジェクトに最適な.gitignoreを設定してください!