Git の無視

Git は作業コピーのあらゆるファイルを次の3つのうちの1つとみなします。

1. 追跡済み - 以前にステージまたはコミットされたファイル。

2. 未追跡 - ステージまたはコミットされていないファイル。

3. 無視 - 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 の無視パターン

.gitignoreグロブパターンを使用してファイル名を照合します。様々なシンボルを使用して独自のパターンを作成できます。

パターン

一致する例

説明*

**/logs

logs/debug.log

logs/monday/foo.bar

build/logs/debug.log

リポジトリ内の任意のディレクトリと照合するために、2つのアスタリスクをパターンの前に追加することができます。

**/logs/debug.log

logs/debug.log

build/logs/debug.log

以下は含まない

logs/build/debug.log

ファイル名や親ディレクトリの名前に基づいてファイルを照合するために2つのアスタリスクを使用することもできます。

*.log

debug.log

foo.log

.log

logs/debug.log

アスタリスクは、0 個以上の文字に一致するワイルドカードです。

*.log

!important.log

debug.log

以下は含まない

logs/debug.log

感嘆符をパターンの先頭に追加すると、パターンを否定します。ファイルが、あるパターンと一致するが、ファイルの後半で定義済みの否定パターンと一致する場合、そのファイルは無視されません。

/debug.log

debug.log

以下は含まない

logs/debug.log

否定パターンの後に定義されたパターンは、以前に無効化されたファイルを再度すべて無視します。

debug.log

debug.log

logs/debug.log

スラッシュを先頭に追加すると、リポジトリのルートにあるファイルのみ照合します。

debug?.log

debug0.log

debugg.log

以下は含まない

debug10.log

疑問符は正確に 1 文字に一致します。

debug[0-9].log

debug0.log

debug1.log

以下は含まない

debug10.log

角括弧を使用して、指定した範囲の 1 文字を照合することもできます。

debug[01].log

debug0.log

debug1.log

以下は含まない

debug2.log

debug01.log

角括弧は、指定されたセットの1つの文字と一致します。

debug[!01].log

debug2.log

以下は含まない

debug0.log

debug1.log

debug01.log

感嘆符を使用して、指定されたセット以外の文字を照合できます。

debug[a-z].log

debuga.log

debugb.log

以下は含まない

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

以下は含まない

logs/latest/debug.log

ワイルドカードはディレクトリ名でも使用できます。

logs/debug.log

logs/debug.log

以下は含まない

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_storethumbs.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 に渡せます。名前自体は、リポジトリに存在するファイルと一致する必要はありません。

推奨

Bitbucket ブログ

DevOps ラーニング パス

Git の詳細

その他の Git ガイドとリソースについては、このハブをご確認ください。