.gitignore

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
trace.log
以下は該当しません。
important.log
logs/important.log
感嘆符をパターンの先頭に追加すると、パターンを否定します。ファイルが、あるパターンと一致するが、ファイルの後半で定義済みの否定パターンと一致する場合、そのファイルは無視されません。
*.log
!important/*.log
trace.*
debug.log
important/trace.log
以下は該当しません。
important/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/**/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 ファイルにコメントを含めることができます。

# すべてのログを無視 *.log

You can use \ to escape .gitignore pattern characters if you have files or directories containing them:

# 文字通り 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

You should be careful what patterns you choose to globally ignore, as different file types are relevant for different projects. Special operating system files (e.g. .DS_Store and thumbs.db) or temporary files created by some developer tools are typical candidates for ignoring globally.

以前にコミットされたファイルを無視

If you want to ignore a file that you've committed in the past, you'll need to delete the file from your repository and then add a .gitignore rule for it. Using the --cached option with git rm means that the file will be deleted from your repository, but will remain in your working directory as an ignored file.

$ echo debug.log>> .gitignore$ git rm --cached debug.logrm 'debug.log'$ git commit -m "Start ignoring debug.log"

You can omit the --cached option if you want to delete the file from both the repository and your local file system.

無視されたファイルのコミット

-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 is a powerful Git feature for temporarily shelving and reverting local changes, allowing you to re-apply them later on. As you'd expect, by default git stash ignores ignored files and only stashes changes to files that are tracked by Git. However, you can invoke git stash with the --all option to stash changes to ignored and untracked files as well.

.gitignore ファイルのデバッグ

If you have complicated .gitignore patterns, or patterns spread over multiple .gitignore files, it can be difficult to track down why a particular file is being ignored. You can use the git check-ignore command with the -v (or --verbose) option to determine which pattern is causing a particular file to be ignored:

$ git check-ignore -v debug.log
.gitignore:3:*.logdebug.log

次のような出力が得られます。

<file containing the pattern> : <line number of the pattern> : <pattern> <file name>

You can pass multiple file names to git check-ignore if you like, and the names themselves don't even have to correspond to files that exist in your repository.

Git を学習する準備はできていますか?

この対話式チュートリアルを利用しましょう。

今すぐ始める