.gitignore
Git は作業コピーのあらゆるファイルを次の3つのうちの1つとみなします。
- 追跡済み - 以前にステージングまたはコミットされたファイル。
- 未追跡 - ステージングまたはコミットされていないファイル。
- 無視 - Git が明示的に無視するように指示されたファイル。
無視されるファイルは通常、リポジトリーソースから派生するか、またはコミットされないようにするビルド成果物およびマシン生成ファイルです。一般的な使用例の一部を次に挙げます。
/node_modules
または/packages
のコンテンツなどの、依存関係のキャッシュ- コンパイルされたコード (
.o
、.pyc
、および.class
ファイルなど) - ビルド出力ディレクトリ (
/bin
、/out
、または/target
など) - 実行時に生成されるファイル (
.log
、.lock
、または.tmp
など) - 非表示のシステムファイル (
.DS_Store
またはThumbs.db
など) .idea/workspace.xml
などの個人用 IDE 設定ファイル
無視されたファイルは、.gitignore
という名前の特別なファイルで追跡されます。これはリポジトリのルートでチェックインされます。明示的な git ignore コマンドはありません。無視したい新規ファイルがある場合には、代わりに .gitignore
ファイルを手動で編集してコミットする必要があります。.gitignore
ファイルには、ファイルを無視すべきかどうかを決定するためにリポジトリ内のファイル名と一致するパターンが含まれています。
- Git におけるファイルの無視
Git の無視パターン
.gitignore
はグロブパターンを使用してファイル名を照合します。様々なシンボルを使用して独自のパターンを作成できます。
パターン | 一致する例 | 説明* |
---|---|---|
**/logs | logs/debug.log logs/monday/foo.bar build/logs/debug.log | リポジトリ内の任意のディレクトリと照合するために、2つのアスタリスクをパターンの前に追加することができます。 |
**/logs/debug.log | logs/debug.log build/logs/debug.log but not logs/build/debug.log | ファイル名や親ディレクトリの名前に基づいてファイルを照合するために2つのアスタリスクを使用することもできます。 |
*.log | debug.log foo.log .log logs/debug.log | アスタリスクは、0 個以上の文字に一致するワイルドカードです。 |
*.log !important.log | debug.log trace.log but not important.log logs/important.log | 感嘆符をパターンの先頭に追加すると、パターンを否定します。ファイルが、あるパターンと一致するが、ファイルの後半で定義済みの否定パターンとも一致する場合、そのファイルは無視されません。 |
*.log !important/*.log trace.* | debug.log important/trace.log but not important/debug.log | 否定パターンの後に定義されたパターンは、以前に無効化されたファイルを再度すべて無視します。 |
/debug.log | debug.log but not logs/debug.log | スラッシュを先頭に追加すると、リポジトリのルートにあるファイルのみ照合します。 |
debug.log | debug.log logs/debug.log | 既定では、パターンは任意のディレクトリ内のファイルと照合されます。 |
debug?.log | debug0.log debugg.log but not debug10.log | 疑問符は正確に 1 文字に一致します。 |
debug[0-9].log | debug0.log debug1.log but not debug10.log | 角括弧を使用して、指定した範囲の 1 文字を照合することもできます。 |
debug[01].log | debug0.log debug1.log but not debug2.log debug01.log | 角括弧は、指定されたセットの1つの文字と一致します。 |
debug[!01].log | debug2.log but not debug0.log debug1.log debug01.log | 感嘆符を使用して、指定されたセット以外の文字を照合できます。 |
debug[a-z].log | debuga.log debugb.log but not debug1.log | 範囲は数値またはアルファベットです。 |
logs | logs logs/debug.log logs/latest/foo.bar build/logs build/logs/debug.log | スラッシュを付けないと、その名前を持つファイルおよびディレクトリのコンテンツの両方がパターンと照合されます。左の例の照合では、logs という名前のディレクトリとファイルの両方が無視されます。 |
logs/ | logs/debug.log logs/latest/foo.bar build/logs/foo.bar build/logs/latest/debug.log | スラッシュを追加して、パターンがディレクトリであることを示します。その名前に一致するリポジトリ内のディレクトリのすべてのコンテンツ (そのファイルとサブディレクトリをすべて含む) が無視されます。 |
logs/ !logs/important.log | logs/debug.log logs/important.log | 注意! 左の例で logs/important.log は無効にすべきではありません。Git のパフォーマンス関連の癖のため、ディレクトリに一致するパターンにより無視されるファイルは無効にできません。 |
logs/*day/debug.log | logs/debug.log logs/monday/debug.log logs/monday/pm/debug.log | 2つのアスタリスクは、0 個以上のディレクトリと一致します。 |
logs/*day/debug.log | logs/monday/debug.log logs/tuesday/debug.log but not logs/latest/debug.log | ワイルドカードはディレクトリ名でも使用できます。 |
logs/debug.log | logs/debug.log but not debug.log build/logs/debug.log | 特定のディレクトリ内のファイルを指定するパターンは、リポジトリのルート相対パスです。(スラッシュを前に付けることもできますが、特に何も生じません。) |
** この説明は、ご使用の .gitignore ファイルが規則と同様に、リポジトリの最上位ディレクトリにあることを想定しています。リポジトリに複数の .gitignore ファイルがある場合、単に頭の中で "リポジトリルート" を ".gitignore ファイルを含むディレクトリ" と置き換えてください (そして、チームが混乱しないようにファイルを統合することを検討してください)。*
これらの文字に加えて、# を使用して .gitignore
ファイルにコメントを含めることができます。
# ignore all logs
*.log
.gitignore
パターン文字が含まれるファイルまたはディレクトリがある場合、\ を使用してそれらのパターン文字をエスケープできます。
# ignore the file literally named foo[01].txt
foo\[01\].txt
リポジトリ内の共有 .gitignore ファイル
Git は通常 .gitignore
ファイルで定義される規則を無視します。このファイルは、ユーザーのリポジトリのルートにあります。しかし、ユーザーのリポジトリ内の様々なディレクトリにある複数の .gitignore
ファイルを定義するという選択肢があります。特定の .gitignore
ファイルの各パターンがそのファイルがあるディレクトリに対してテストされます。ただし、従来の、最もシンプルな方法はルートで単一の .gitignore
ファイルを定義することです。.gitignore
ファイルをチェックインすると、ユーザーのリポジトリ内の他のファイルと同様にバージョン管理され、プッシュ時にチームメートと共有されます。一般的に、.gitignore
に含めるパターンは、リポジトリの他のユーザーにとってメリットになるものに限定すべきです。
個人用の Git 無視規則
また、特定のリポジトリの個人用無視パターンを .git/info/exclude
にある特別なファイルに定義することもできます。これらはバージョン管理されず、ユーザーのリポジトリと共に配布されないので、自分にのみメリットがある可能性が高いパターンを含めるには適した場所です。たとえば、カスタムロギング設定や、リポジトリの作業ディレクトリにファイルを生成する特別な開発ツールがある場合、それらを .git/info/exclude
に追加して、誤って自分のリポジトリにコミットされないようにすることができます。
グローバルな Git 無視規則
さらに、Git core.excludesFile
プロパティを設定することで、ローカルシステム上のすべてのリポジトリに対するグローバル Git の無視パターンを定義することができます。このファイルは自分で作成する必要があります。グローバルな .gitignore
ファイルを配置すべき場所がよくわからない場合は、ホームディレクトリでかまいません (後で簡単に見つけることができます)。ファイルを作成したら、git config
でその場所を設定する必要があります。
$ touch ~/.gitignore
$ git config --global core.excludesFile ~/.gitignore
プロジェクトによって異なる種類のファイルが関連するため、グローバルに無視するパターンは慎重に選択する必要があります。特殊なオペレーティング システム ファイル (.ds_store
や thumbs.db
など) または一部の開発ツールで作成された一時ファイルが、グローバルに無視する一般的な候補になります。
以前にコミットされたファイルを無視
過去にコミットしたファイルを無視する場合、リポジトリからファイルを削除してから、それに対して .gitignore
ルールを追加する必要があります。--cached
オプションを git rm
で使用すると、ファイルはリポジトリから削除されますが、無視されたファイルとして作業ディレクトリに残ります。
$ echo debug.log >> .gitignore
$ git rm --cached debug.log
rm 'debug.log'
$ git commit -m "Start ignoring debug.log"
ファイルをリポジトリとローカル ファイル システムの両方から削除する場合は、--cached
オプションを省略できます。
無視されたファイルのコミット
-f
(または --force
) オプションを git add
で使用して、無視されたフィルをリポジトリに強制的にコミットすることができます。
$ cat .gitignore
*.log
$ git add -f debug.log
$ git commit -m "Force adding debug.log"
一般的なパターン (*.log
など) が定義されていても、特定のファイルをコミットしたい場合は、これを行うとよいでしょう。ただし、より良い解決策は一般的な規則の例外を定義することです。
$ echo !debug.log >> .gitignore
$ cat .gitignore
*.log
!debug.log
$ git add debug.log
$ git commit -m "Adding debug.log"
これは、チームメイトにとって明白で、混乱を招きにくいアプローチです。
無視されたファイルを隠す
git stash
は、ローカルの変更を一時的に棚上げして取り消した後、再適用できる高度な Git 機能です。既定では、git stash
では無視されたファイルは無視されて、Git の追跡対象ファイルに対する変更のみが一時退避されます。ただし、--all オプションを指定して git stash を呼び出して、無視されたファイルや追跡対象外のファイルに対する変更も一時退避できます。
.gitignore ファイルのデバッグ
.gitignore
パターンを複雑化したかパターンが複数の .gitignore
ファイルに分散している場合は、特定のファイルが無視されている理由を特定しにくい可能性があります。git check-ignore
コマンドを-v
(または --verbose
) オプションを指定して使用し、特定のファイルが無視される原因となっているパターンを特定できます。
$ git check-ignore -v debug.log
.gitignore:3:*.log debug.log
次のような出力が得られます。
<file containing the pattern> : <line number of the pattern> : <pattern> <file name>
必要に応じて、複数のファイル名を git check-ignore
に渡せます。名前自体は、リポジトリに存在するファイルと一致する必要はありません。