日本語 ▾ Topics ▾ Latest version ▾ gitignore last updated in 2.42.0

NAME

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の配管ツール、例えば’git ls-files’や’git read-tree’は、コマンドラインオプションで指定された`gitignore`パターン、またはコマンドラインオプションで指定されたファイルから読み取ります。'git status’や’git add’などの上位レベルのGitツールは、上記で指定されたソースからのパターンを使用します。

パターンフォーマット

  • 空白行はどのファイルにも一致しないため、読みやすさのための区切りとして機能します。

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

  • 末尾のスペースはバックスラッシュ("\")で引用されない限り無視されます。

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

  • スラッシュ"/"はディレクトリの区切り文字として使用されます。区切り文字は`.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" はファイルまたはディレクトリ "bar" がディレクトリ "foo" 直下の任意の場所にある場合にマッチします。

  • 末尾の "/**" は、その中にあるすべてのファイルにマッチします。例えば、"abc/**" はディレクトリ "abc" 内のすべてのファイルにマッチします。これは .gitignore ファイルの位置からの相対パスで、深さは無限です。

  • 末尾以外での "/**" は、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.txt、`hello.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
    [...]
    # 追跡されていないファイル:
    [...]
    #       Documentation/foo.html
    #       Documentation/gitignore.html
    #       file.o
    #       lib.a
    #       src/internal.o
    [...]
    $ cat .git/info/exclude
    # オブジェクトとアーカイブを無視、ツリー内のどこでも。
    *.[oa]
    $ cat Documentation/.gitignore
    # 生成されたhtmlファイルを無視、
    *.html
    # 手動で管理されるfoo.htmlを除く
    !foo.html
    $ git status
    [...]
    # 追跡されていないファイル:
    [...]
    #       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
    # foo/bar ディレクトリ以外のすべてを除外
    /*
    !/foo
    /foo/*
    !/foo/bar

GIT

Part of the git[1] suite

scroll-to-top