English ▾ トピック ▾ 最新バージョン ▾ gitignore 最終更新日: 2.42.0

名前

gitignore - 意図的に追跡されないファイルを無視する

概要

$XDG_CONFIG_HOME/git/ignore, $GIT_DIR/info/exclude, .gitignore

説明

gitignore ファイルは、Git が無視すべき、意図的に追跡されないファイルを指定します。Git によってすでに追跡されているファイルには影響しません。詳細は以下の「注記」セクションを参照してください。

gitignore ファイルの各行はパターンを指定します。パスを無視するかどうかを決定する際、Git は通常、複数のソースから gitignore パターンをチェックし、以下の優先順位(高い順から低い順)に従います(同じ優先順位レベル内では、最後に一致したパターンが結果を決定します)。

  • それらをサポートするコマンドのコマンドラインから読み取られたパターン。

  • パスと同じディレクトリ、またはその親ディレクトリ(作業ツリーのトップレベルまで)にある .gitignore ファイルから読み取られたパターン。上位レベルのファイルにあるパターンは、ファイルを含むディレクトリまで下位レベルのファイルにあるパターンによって上書きされます。これらのパターンは、.gitignore ファイルの場所を基準に一致します。プロジェクトには通常、プロジェクトビルドの一部として生成されるファイルのパターンを含む、このような .gitignore ファイルがリポジトリに含まれています。

  • $GIT_DIR/info/exclude から読み取られたパターン。

  • 設定変数 core.excludesFile で指定されたファイルから読み取られたパターン。

パターンをどのファイルに配置するかは、そのパターンがどのように使用されるべきかによって異なります。

  • バージョン管理され、クローンによって他のリポジトリに配布されるべきパターン(つまり、すべての開発者が無視したいファイル)は、.gitignore ファイルに入れるべきです。

  • 特定のリポジトリに固有だが、他の関連リポジトリと共有する必要がないパターン(例:リポジトリ内に存在するが、特定のユーザーのワークフローに固有の補助ファイル)は、$GIT_DIR/info/exclude ファイルに入れるべきです。

  • ユーザーがすべての状況で Git に無視させたいパターン(例:ユーザーが選択したエディタによって生成されるバックアップファイルや一時ファイル)は、通常、ユーザーの ~/.gitconfig 内の core.excludesFile で指定されたファイルに入れます。デフォルト値は $XDG_CONFIG_HOME/git/ignore です。$XDG_CONFIG_HOME が設定されていないか空の場合、代わりに $HOME/.config/git/ignore が使用されます。

git ls-filesgit read-tree などの基盤となるGitの配管ツールは、コマンドラインオプションで指定された、またはコマンドラインオプションで指定されたファイルから gitignore パターンを読み取ります。git statusgit add などの上位レベルのGitツールは、上記のソースからパターンを使用します。

パターン形式

  • 空の行はどのファイルにも一致しないため、可読性を高めるための区切り文字として機能します。

  • # で始まる行はコメントとして機能します。ハッシュで始まるパターンの場合は、最初のハッシュの前にバックスラッシュ ("\") を付けてください。

  • 末尾の空白は、バックスラッシュ ("\") でクォートされていない限り無視されます。

  • パターンを否定するオプションのプレフィックス "!"。以前のパターンで除外された一致するファイルはすべて、再度含まれるようになります。ファイルの親ディレクトリが除外されている場合、そのファイルを再含めることはできません。Git はパフォーマンス上の理由から除外されたディレクトリをリストしないため、含まれるファイルに対するパターンは、どこで定義されていても効果がありません。リテラルな "!" で始まるパターンの場合は、最初の "!" の前にバックスラッシュ ("\") を付けてください。例: "\!important!.txt"。

  • スラッシュ "/" はディレクトリ区切り文字として使用されます。区切り文字は、.gitignore 検索パターンの先頭、中間、または末尾に現れることがあります。

  • パターンの先頭または中間(または両方)に区切り文字がある場合、パターンは特定の .gitignore ファイル自体のディレクトリレベルを基準とします。それ以外の場合、パターンは .gitignore レベルより下の任意のレベルでも一致する可能性があります。

  • パターンの末尾に区切り文字がある場合、パターンはディレクトリのみに一致し、そうでない場合、パターンはファイルとディレクトリの両方に一致する可能性があります。

  • 例えば、パターン doc/frotz/ はディレクトリ doc/frotz に一致しますが、ディレクトリ a/doc/frotz には一致しません。しかし、frotz/ はディレクトリである frotza/frotz に一致します(すべてのパスは .gitignore ファイルからの相対パスです)。

  • アスタリスク "*" はスラッシュ以外の何にでも一致します。文字 "?" は "/" 以外の任意の1文字に一致します。範囲表記、例: [a-zA-Z]、は範囲内のいずれかの文字に一致するために使用できます。より詳細な説明については、fnmatch(3) および FNM_PATHNAME フラグを参照してください。

完全パス名と照合されるパターン内の2つの連続したアスタリスク(「**」)には特別な意味がある場合があります。

  • スラッシュに続く先頭の "**" は、すべてのディレクトリに一致することを意味します。例えば、"**/foo" は、パターン "foo" と同じように、どこにあるファイルまたはディレクトリ "foo" にも一致します。"**/foo/bar" は、ディレクトリ "foo" の直下にあるどこにあるファイルまたはディレクトリ "bar" にも一致します。

  • 末尾の "/**" は、その中にあるすべてに一致します。たとえば、"abc/**" は、.gitignore ファイルの場所を基準として、深さ無制限でディレクトリ "abc" 内のすべてのファイルに一致します。

  • スラッシュの後に2つの連続したアスタリスク、そしてスラッシュが続くパターンは、0個以上のディレクトリに一致します。例えば、"a/**/b" は "a/b"、"a/x/b"、"a/x/y/b" などに一致します。

  • 他の連続するアスタリスクは通常の "*" とみなされ、以前のルールに従ってマッチします。

設定

オプションの設定変数 core.excludesFile は、$GIT_DIR/info/exclude と同様に、除外するファイル名のパターンを含むファイルへのパスを示します。除外ファイル内のパターンは、$GIT_DIR/info/exclude 内のパターンに加えて使用されます。

注記

gitignore ファイルの目的は、Git によって追跡されていない特定のファイルが追跡されないままであることを保証することです。

現在追跡されているファイルの追跡を停止するには、git rm --cached を使用してインデックスからファイルを削除します。その後、そのファイル名を .gitignore ファイルに追加することで、それ以降のコミットでそのファイルが再導入されるのを停止できます。

Git は、作業ツリー内の .gitignore ファイルにアクセスする際、シンボリックリンクを追跡しません。これにより、ファイルがインデックスまたはツリーからアクセスされる場合と、ファイルシステムからアクセスされる場合で、動作の一貫性が保たれます。

  • パターン hello.* は、名前が hello. で始まる任意のファイルまたはディレクトリに一致します。これをサブディレクトリではなくディレクトリのみに制限したい場合は、パターンにスラッシュを前置します。つまり、/hello.* とします。このパターンは hello.txthello.c に一致しますが、a/hello.java には一致しません。

  • パターン foo/ はディレクトリ foo とその下にあるパスに一致しますが、通常のファイルやシンボリックリンク foo には一致しません(これは Git のパス指定の一般的な動作と一貫しています)。

  • パターン doc/frotz/doc/frotz は、どの .gitignore ファイルでも同じ効果を持ちます。つまり、パターンの中間にスラッシュがすでに存在する場合、先頭のスラッシュは関係ありません。

  • パターン foo/*foo/test.json (通常のファイル)、foo/bar (ディレクトリ) に一致しますが、foo/bar/hello.c (通常のファイル) には一致しません。これは、パターン中のアスタリスクがスラッシュを含む bar/hello.c に一致しないためです。

    $ git status
    [...]
    # Untracked files:
    [...]
    #       Documentation/foo.html
    #       Documentation/gitignore.html
    #       file.o
    #       lib.a
    #       src/internal.o
    [...]
    $ cat .git/info/exclude
    # ignore objects and archives, anywhere in the tree.
    *.[oa]
    $ cat Documentation/.gitignore
    # ignore generated html files,
    *.html
    # except foo.html which is maintained by hand
    !foo.html
    $ git status
    [...]
    # Untracked files:
    [...]
    #       Documentation/foo.html
    [...]

別の例

    $ cat .gitignore
    vmlinux*
    $ ls arch/foo/kernel/vm*
    arch/foo/kernel/vmlinux.lds.S
    $ echo '!/vmlinux*' >arch/foo/kernel/.gitignore

2番目の .gitignore は、Git が arch/foo/kernel/vmlinux.lds.S を無視するのを防ぎます。

特定のディレクトリ foo/bar 以外すべてを除外する例(/* に注意 - スラッシュがないと、ワイルドカードは foo/bar 内のすべてを除外してしまうでしょう)

    $ cat .gitignore
    # exclude everything except directory foo/bar
    /*
    !/foo
    /foo/*
    !/foo/bar

GIT

git[1]スイートの一部

scroll-to-top