よくある話が、環境依存のファイルやライブラリのキャッシュまで、うっかりGit管理下に入れてしまう場面。
ところが、.gitignoreの書き方はパターンの種類が意外と多く、思った通りに除外できないことがある。
この記事では、基本のパターン記法から、すでにコミットしてしまったファイルの除外方法までまとめた。

.gitignoreの基本
リポジトリのルートに.gitignoreという名前のファイルを置くと、そこに書いたパターンに一致するファイル・フォルダがGitの追跡対象から外れる。
# 特定のファイル
.env
# 特定の拡張子すべて
*.log
# 特定のフォルダごと
node_modules/
__pycache__/- 末尾に
/を付けると、フォルダそのものを除外対象にする *は0文字以上の任意の文字列にマッチするワイルドカード
パターン記法で迷いやすいポイント
否定パターン(!)で一部だけ除外を解除する
フォルダごと除外しつつ、特定のファイルだけは残したい場合、!を先頭に付けて除外を打ち消す。
logs/*
!logs/.gitkeepただし、親フォルダ自体が先に除外されていると、否定パターンは効かない。フォルダ配下のファイルを指定して除外し、フォルダ自体は除外しない書き方にする必要がある。
先頭の/でルート直下だけに限定する
パターンの先頭に/を付けると、リポジトリのルート直下のみが対象になる。付けなければ、同名のファイル・フォルダがどの階層にあっても対象になる。
/build/ # ルート直下のbuildフォルダのみ除外
build/ # どの階層のbuildフォルダも除外意外と見落としがちだが、この違いを意識しないと、想定より広い範囲・あるいは狭い範囲を除外してしまうことがある。
すでにコミット済みのファイルを除外する
.gitignoreに書いても、すでにGit管理下に入っているファイルは自動では除外されない。これが一番つまずきやすいポイント。
この場合は、Gitの追跡だけを解除する。
git rm --cached .env
git commit -m "Remove .env from tracking"--cachedを付けることで、ローカルのファイル自体は残したまま、Gitの追跡対象からだけ外せる。この状態で.gitignoreに書いておけば、以降は変更が追跡されなくなる。
フォルダごと除外し直したい場合は-rを付ける。
git rm -r --cached node_modulesプロジェクト共通ではなく自分の環境だけ除外したい場合
エディタの設定ファイルなど、チームの.gitignoreには含めたくない、自分だけの除外ルールもある。その場合はグローバルな除外設定を使う。
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つの応用を覚えておけば困らない。

コメント