.gitignoreジェネレーター

言語・フレームワーク・OSを選んで.gitignoreを生成

言語・ランタイム

フレームワーク・ツール

OS・エディタ

.gitignoreジェネレーターについて

.gitignoreは、Gitが「まだ追跡していないファイル」のうちどれを見なかったことにするかを決める一覧です。ビルド成果物、依存パッケージのフォルダ、OSが勝手に作るファイル、秘密情報を含む環境変数ファイルなど、リポジトリに入れてはいけないものを除外します。

このツールは言語・フレームワーク・OS・エディタ別のテンプレートを選んで1つのファイルにまとめます。選んだ順番に関係なく、常に言語→フレームワーク→OSの順に並べ、各ブロックの前に ### Node.js ### のような見出しコメントを付けます。自分で入力したパターンは末尾の ### Custom ### の下に入ります。テンプレートの多くはGitHubのgithub/gitignoreをもとにしています。

パターン規則で混乱しやすい4点

Git公式ドキュメントに沿って整理すると次のとおりです。

  • 末尾の / はディレクトリだけを意味します。build/ はbuildというフォルダとその中身を無視しますが、buildという名前のファイルは無視しません。
  • 先頭や途中に / があると、.gitignoreの場所を基準にしたパスになります。/TODO は最上位のTODOだけ、doc/frotz はその位置から見たdoc/frotzだけです。/ を含まない *.log や node_modules/ はどの階層でも一致します。
  • ** は複数階層を表します。**/logs はどこにあるlogsでも、a/**/b は a/b、a/x/b、a/x/y/b のすべてに一致します。
  • 同じファイル内では最後に一致した行が勝ちます。そのため例外(!)は除外規則より下に書きます。

! の例外が効かないとき

ドキュメントに明記された制約があります。親ディレクトリが丸ごと除外されていると、その中のファイルを ! で再び含めることはできません。Gitは性能上の理由で、除外したディレクトリの中身をそもそも調べないためです。

このツールのVS Codeテンプレートがよい例です。.vscode/ ではなく .vscode/* と書いたうえで、!.vscode/settings.json や !.vscode/extensions.json を例外にしています。.vscode/* はフォルダ自体ではなく中身を除外するので、Gitはフォルダの中を見て例外を適用できます。.vscode/ と書いていたら、下の例外行はすべて無効です。Node.jsテンプレートの .env.* と !.env.example も同じ仕組みで、本物の鍵が入った.env.localは外れ、必要な変数を示すサンプルだけがコミットされます。

コミット済みのファイルは.gitignoreでは消えない

.gitignoreが効くのは追跡されていないファイルだけです。一度コミットしたファイルは、一覧に追加しても変更が検出され続けます。追跡をやめるには git rm --cached ファイル名(フォルダなら git rm -r --cached フォルダ名)でインデックスからだけ削除してコミットします。作業フォルダの実ファイルは残ります。

秘密情報は別問題です。.envを誤ってコミットしてから追跡を外しても、過去のコミットに内容は残っており、プッシュ済みなら他の人も取得できます。まずキーを失効させて再発行してください。

テンプレートをそのまま使う前に確認したい行

テンプレートは一般的なケースに合わせて広めに書かれており、自分のプロジェクトのソースまで隠してしまうことがあります。このツールのPythonテンプレートには lib/、build/、dist/ が含まれ、自作のlibフォルダがあると新しいファイルが黙ってコミットから漏れます。Node.jsテンプレートには out と dist、JetBrainsテンプレートにも out/ があります。

あるファイルがなぜ無視されるかは git check-ignore -v パス で確認できます。どの.gitignoreの何行目のどのパターンが一致したかを表示します。必要なフォルダが引っかかっていたら、追加パターン欄に !lib/ のように書けば戻せます。追加パターンはファイルの末尾に付くので、前のテンプレート規則を上書きできます。

エディタやOSのファイル(.DS_Store、Thumbs.db、.idea/)は、git config --global core.excludesFile で個人のグローバル設定に置く方法もあります。ただ共同作業のリポジトリでは他の人の設定を当てにできないので、プロジェクトの.gitignoreにも入れておくのが無難です。

例

Python+macOS+追加パターンの例外

入力
PythonとmacOSを選択/追加パターン: !lib/
結果
### Python ### # Byte-compiled / optimized / DLL files __pycache__/ *.py[codz] ... lib/ ... ### macOS ### .DS_Store ... ### Custom ### !lib/

Pythonブロックの lib/ が先に来て、末尾の !lib/ がそれを打ち消します。同じファイル内では最後の一致が勝つので、libフォルダは再び追跡対象になります。

効かない例外の書き方

入力
logs/ !logs/keep.txt
結果
logs/keep.txt も無視される

logs/ がフォルダごと除外され、Gitは中を見ません。logs/* と !logs/keep.txt に書き換えれば keep.txt だけが追跡されます。

コミット済みフォルダの整理

入力
node_modules/ をコミットした後で.gitignoreに追加
結果
git rm -r --cached node_modules git commit -m "stop tracking node_modules"

インデックスからだけ消すのでローカルのnode_modulesはそのまま残り、以後は.gitignoreが適用されます。

使い方

  1. 使っている言語、フレームワーク、OS、エディタを検索するか一覧から選びます。
  2. テンプレートにないパスや、戻したい例外(!)があれば追加パターン欄に書きます。
  3. 結果をリポジトリ最上位の.gitignoreとして保存し、git statusで除外されるべきファイルが消えたか確認します。

よくある質問

.gitignoreに書いたのにファイルが表示され続けます。

既にコミットされたファイルです。git rm --cached ファイル名 で追跡を外してコミットしてください。ローカルのファイルは残ります。

空のフォルダをリポジトリに残したいです。

Gitはフォルダではなくファイルを追跡するので、空フォルダはコミットされません。慣例として .gitkeep のような空ファイルを置き、中身を無視したい場合は folder/* と !folder/.gitkeep を組み合わせます。

.gitignore自体はコミットすべきですか?

はい。チーム全員に同じ規則を適用するためです。自分の環境だけの規則は .git/info/exclude に書けばコミットされません。

サブフォルダにも.gitignoreを置けますか?

置けます。サブフォルダの.gitignoreのパターンはそのフォルダ基準で解釈され、規則がぶつかったときは深い方が優先されます。

出典

基準日:

プライバシーとデータの扱い