.gitignoreの書き方完全ガイド|パターン記法から適用済みファイルの除外まで

よくある話が、環境依存のファイルやライブラリのキャッシュまで、うっかりGit管理下に入れてしまう場面。

ところが、.gitignoreの書き方はパターンの種類が意外と多く、思った通りに除外できないことがある。

この記事では、基本のパターン記法から、すでにコミットしてしまったファイルの除外方法までまとめた。

.gitignoreの基本

リポジトリのルートに.gitignoreという名前のファイルを置くと、そこに書いたパターンに一致するファイル・フォルダがGitの追跡対象から外れる。

Bash
# 特定のファイル
.env

# 特定の拡張子すべて
*.log

# 特定のフォルダごと
node_modules/
__pycache__/
  • 末尾に/を付けると、フォルダそのものを除外対象にする
  • *は0文字以上の任意の文字列にマッチするワイルドカード

パターン記法で迷いやすいポイント

否定パターン(!)で一部だけ除外を解除する

フォルダごと除外しつつ、特定のファイルだけは残したい場合、!を先頭に付けて除外を打ち消す。

Bash
logs/*
!logs/.gitkeep

ただし、親フォルダ自体が先に除外されていると、否定パターンは効かない。フォルダ配下のファイルを指定して除外し、フォルダ自体は除外しない書き方にする必要がある。

先頭の/でルート直下だけに限定する

パターンの先頭に/を付けると、リポジトリのルート直下のみが対象になる。付けなければ、同名のファイル・フォルダがどの階層にあっても対象になる。

Bash
/build/     # ルート直下のbuildフォルダのみ除外
build/      # どの階層のbuildフォルダも除外

意外と見落としがちだが、この違いを意識しないと、想定より広い範囲・あるいは狭い範囲を除外してしまうことがある。

すでにコミット済みのファイルを除外する

.gitignoreに書いても、すでにGit管理下に入っているファイルは自動では除外されない。これが一番つまずきやすいポイント。

この場合は、Gitの追跡だけを解除する。

Bash
git rm --cached .env
git commit -m "Remove .env from tracking"

--cachedを付けることで、ローカルのファイル自体は残したまま、Gitの追跡対象からだけ外せる。この状態で.gitignoreに書いておけば、以降は変更が追跡されなくなる。

フォルダごと除外し直したい場合は-rを付ける。

Bash
git rm -r --cached node_modules

プロジェクト共通ではなく自分の環境だけ除外したい場合

エディタの設定ファイルなど、チームの.gitignoreには含めたくない、自分だけの除外ルールもある。その場合はグローバルな除外設定を使う。

Bash
git config --global core.excludesfile ~/.gitignore_global

プロジェクトの.gitignoreにはリポジトリ全体で共有すべきルールだけを書き、個人の作業環境に依存するルールはグローバル設定側に分けておくと、他のメンバーの.gitignoreを汚さずに済む。

よくある質問

本文で触れきれなかった細かい疑問をQ&Aでまとめておきます。

言語・フレームワークごとの.gitignoreテンプレートはありますか?

GitHub公式が公開しているgitignoreリポジトリに、言語・ツール別のテンプレートがまとまっています。新規プロジェクトを作る際は、まずここから該当するテンプレートをコピーしてから、プロジェクト固有のルールを追記するのがおすすめです。

.gitignoreを追記・修正したのに反映されません。なぜですか?

すでにコミット済みのファイルは、.gitignoreの新規ルールの影響を受けません。対象ファイルに対してgit rm --cachedを実行し、Gitの追跡から一度外す必要があります。

特定のファイルだけ、チーム全体の.gitignoreを無視して強制的に追跡させたいです。

git add -f <ファイル名>で、.gitignoreのルールを無視して強制的にステージできます。ただし恒常的に必要なら、.gitignore側に否定パターン(!)を追記するほうがチームで扱いやすくなります。

まとめ

基本のパターンさえ押さえれば、あとは「すでに追跡済みならrm --cached」「個人設定はグローバル側」という2つの応用を覚えておけば困らない。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

普段は主にPython開発をしています。
最近はAI駆動開発にも関わっています。

コメント

コメントする