日本語 ▾ トピック ▾ 最新バージョン ▾ gitignoreは2.42.0で最終更新

名前

gitignore - 意図的にGitの追跡対象から外すファイルを指定する

概要

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

説明

gitignoreファイルは、Gitが無視すべき意図的に追跡対象外のファイルを指定します。Gitによって既に追跡されているファイルは影響を受けません。詳細については、以下のNOTESを参照してください。

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

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

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

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

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

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

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

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

  • ユーザーがGitにすべての場合で無視させたいパターン(例:ユーザーが選択したエディタによって生成されるバックアップファイルや一時ファイル)は、通常、ユーザーの~/.gitconfigcore.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つの連続したアスタリスク、そしてスラッシュが続くパターンは、ゼロ個以上のディレクトリに一致します。たとえば、「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(ディレクトリ)に一致しますが、パターン中のアスタリスクがスラッシュを含むbar/hello.cに一致しないため、foo/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