Git でディレクトリ(フォルダ)を除外する方法
末尾スラッシュによるディレクトリ限定マッチ、リポジトリルート固定と再帰走査の違い、空ディレクトリを維持する .gitkeep の活用法を完全整理。
Git のパターン末尾にスラッシュ (/) を付与すると、Git は通常ファイルを無視し、ディレクトリのみを対象として除外判定を行います:
# Matches only directories named "build/" (e.g. /build/, /src/build/)
build/
# Matches BOTH a directory named "build" AND a file named "build"
buildフォルダを除外したい場合は、常に末尾スラッシュを付けて記述してください。これにより拡張子のないスクリプトや同名のファイルを誤って無視するリスクを防止できます。
先頭にスラッシュがないフォルダ名は、リポジトリ内のあらゆる深さの階層でマッチします:
# Matches "logs/" anywhere in the repository: /logs/, /apps/web/logs/, etc.
logs/
# Anchored: Matches "logs/" ONLY at the repository root
/logs/親フォルダ自体は除外せず、その中の特定サブディレクトリのみを対象とする場合は、glob ワイルドカードと組み合わせます:
# Ignore any folder named "temp" inside any "build" directory
build/**/temp/
# Ignore all subdirectories inside packages except package files
packages/*/dist/Git は「ファイル」のみを追跡し、空のフォルダ単体を記録できません。uploads/ や logs/ などの空フォルダ構造を維持したい場合は、.gitkeep 慣例を使用します:
# 1. Ignore everything inside uploads/
uploads/*
# 2. But whitelist the .gitkeep file inside it
!uploads/.gitkeep親フォルダ自体が除外されている場合、配下のサブフォルダを ! で再含めることはできません。フォルダの中身をワイルドカードで除外し、対象サブフォルダを指定します:
# Ignore everything inside config/
config/*
# Whitelist production folder and its contents
!config/production/
!config/production/**よくある質問 (FAQ)
.gitignore の書き方、キャッシュ削除、リポジトリ管理に関するエンジニアの疑問に回答します。
.gitignore における folder と folder/ の違いは何ですか?
'folder/' はディレクトリのみにマッチします。スラッシュのない 'folder' は同名の通常ファイルとディレクトリの両方にマッチします。
Git で空のフォルダをコミットするにはどうすればよいですか?
フォルダ内に .gitkeep という空ファイルを配置し、'folder/*' で中身を除外した上で '!folder/.gitkeep' を例外指定するのが標準的な方法です。
フォルダ自体は残して中身のファイルだけを除外するには?
'directory/' の代わりに 'directory/*' と記述してください。ディレクトリ自体の走査をスキップさせずに、中身の全要素のみを除外できます。