Git
英語 ▾ トピック ▾ 最新バージョン ▾ .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はパフォーマンス上の理由から除外されたディレクトリをリストしません。そのため、含まれるファイルのパターンはどこに定義されていても効果がありません。

  • スラッシュ "/" はディレクトリセパレーターとして使用されます。セパレーターは、.gitignore検索パターンの先頭、中央、または末尾に存在する可能性があります。

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

  • パターンの末尾にセパレーターがある場合、パターンはディレクトリにのみ一致します。それ以外の場合は、ファイルとディレクトリの両方に一致する可能性があります。

  • たとえば、パターンdoc/frotz/doc/frotzディレクトリに一致しますが、a/doc/frotzディレクトリには一致しません。ただし、frotz/はディレクトリであるfrotzおよびa/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と同様に、除外するファイル名のパターンを含むファイルへのパスを示します。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におけるpathspecの一般的な動作と一貫しています)。

  • パターン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