web-dev-qa-db-ja.com

gitignore:1つの特定のファイルタイプを除くフォルダー階層内のすべてのファイルを無視します

フォルダー階層のどこかにある可能性のある特定のファイルタイプを除いて、以下およびフォルダー内のすべてのファイルを無視したいと思います。

/Test
/Test/unknown/folder/structure/below

ここで、layout.cssという名前の特定のcssファイルを除いて、Testフォルダー内およびその下のすべてのファイルを無視したいと思います。例:

/Test/layout.css
/Test/fileto.ignore
/Test/another/folder/ig.nore
/Test/in/a/unknown/folder/layout.css
/Test/in/a/unknown/folder/ignore.me

.gitignoreは無視する必要があります

/Test/fileto.ignore
/Test/another/folder/ig.nore
/Test/in/a/unknown/folder/ignore.me

.gitignoreファイルが機能しません:

Test/
!layout.css

助言がありますか?

26
Jörg

.gitignoreディレクトリに次の内容のTest/ファイルを配置することで、例を機能させることができました。

*
!*/
!.gitignore
!layout.css
27
David Alber

あなたが望むことを達成するために、あなたはいくつかの否定的な除外を使用する必要があるでしょう。

基本的な考え方は、無視したくないファイルのすべての親ディレクトリを除外する必要があるということです。

したがって、/ Test/in/a/unknown/folder/layout.cssをgitリポジトリに追加する場合は、/ Test /、/ Test/in /、/ Test/in/aを無視しないようにする必要があります。 /、/ Test/in/a/unknown /、および/ Test/in/a/unknown/folder /。

次に、いくつかの無視されたファイルといくつかの無視されていないファイルがあるディレクトリに最終的に到達したら、次のようにそれぞれを個別に指定する必要があります。

# Fille: .gitignore
!Test/
Test/*
!Test/layout.css
Test/fileto.ignore
!Test/another/
Test/another/*
!Test/another/folder/
Test/another/folder/*
!Test/in/
Test/in/*
!Test/in/a/
Test/in/a/*
!Test/in/a/unknown/
Test/in/a/unknown/*
!Test/in/a/unknown/folder/
Test/in/a/unknown/folder/ignore.me
!Test/in/a/unknown/folder/layout.css

したがって、$ git add-allを実行すると、目的の結果が表示されます。

$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   .gitignore
    new file:   Test/in/a/unknown/folder/layout.css
    new file:   Test/layout.css

注:git add-allがファイルをgitリポジトリに追加する最良の方法である理由の説明は、 http://lexsheehan.blogspot.com/2014/05/git-add-update)にあります。 html

11
l3x

かなり古い質問ですが、私は今でもこの問題に苦しんでいたので、問題の実際の解決策を共有すると思いました。

無視されたかのようにGitで空のディレクトリをコミットすることはできませんが、このルールは.gitignoreには適用されません。

から https://git-scm.com/docs/gitignore

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

スラッシュの後に2つの連続するアスタリスクが続く場合、スラッシュは0個以上のディレクトリに一致します。たとえば、「a/**/b」は「a/b」、「a/x/b」、「a/x/y/b」などと一致します。

**ファイルとディレクトリ内のすべて(文字通りすべて)に一致します。

これは、gitignoreドキュメントの別のポイントにつながります。

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

パターンがスラッシュで終わっている場合は、以下の説明のために削除されますが、ディレクトリとの一致のみが検出されます。言い換えると、foo /はディレクトリfooとその下のパスに一致しますが、通常のファイルまたはシンボリックリンクfooには一致しません(これは、Gitでのpathspecの一般的な動作方法と一致しています)。

ここで、次のdir構造があるとしましょう。

/path/to/git/repo
|-- .gitignore
|-- /cache
    |-- somefile
    |-- README    
    |-- /dir
        |-- somefile2
        |-- README

そして、READMEファイルを除いて、cache /内のすべてのファイルを無視したいと思います。

このようにgitignoreを指定すると、次のようになります。

/cache/**
!README

Gitは/cache/READMEを除くすべてを無視します。他のREADMEは、ディレクトリ/cache/dir/cache/**で除外されており、!READMEも適用されないため、表示されません。問題は、gitignoreを次のように指定する必要があります。

# Ignore everything inside cache/ dir
/cache/**
# Except for subdirectories(won't be commited anyway if there is no commited file inside)
!/cache/**/
# And except for README files
!README