158

大きなディレクトリ構造でgitignoreの問題を解決しようとしていますが、質問を簡単にするために、次のようにしました。

新しい git リポジトリに次の 2 つのファイル (foo、bar) のディレクトリ構造があります (これまでコミットはありません)。

a/b/c/foo
a/b/c/bar

明らかに、「git status -u」は次を示します。

# Untracked files:
...
#       a/b/c/bar
#       a/b/c/foo

私がやりたいことは、a/b/c 内のすべてを無視するが、ファイル「foo」を無視しない .gitignore ファイルを作成することです。

このように .gitignore を作成すると:

c/

次に、「git status -u」を実行すると、foo と bar の両方が無視されることが示されます。

# Untracked files:
...
#       .gitignore

これは私の期待どおりです。

ここで、foo の除外ルールを追加すると、次のようになります。

c/
!foo

gitignore のマンページによると、これでうまくいくと思います。しかし、そうではありません - それでも foo を無視します:

# Untracked files:
...
#       .gitignore

これも機能しません:

c/
!a/b/c/foo

これもありません:

c/*
!foo

与えます:

# Untracked files:
...
#       .gitignore
#       a/b/c/bar
#       a/b/c/foo

その場合、foo は無視されなくなりますが、bar も無視されません。

.gitignore のルールの順序も問題ではないようです。

これも私が期待することをしません:

a/b/c/
!a/b/c/foo

それは foo と bar の両方を無視します。

ファイル a/b/c/.gitignore を作成してそこに配置すると、うまくいく状況が 1 つあります。

*
!foo

しかし、これに関する問題は、最終的に a/b/c の下に他のサブディレクトリが存在することであり、個別の .gitignore をすべてのサブディレクトリに配置する必要はありません。「プロジェクトベース」の .gitignore を作成したいと考えていました。各プロジェクトの最上位ディレクトリに配置でき、すべての「標準」サブディレクトリ構造をカバーするファイル。

これも同等のようです:

a/b/c/*
!a/b/c/foo

これは私が達成できる「作業」に最も近いものかもしれませんが、完全な相対パスと明示的な例外を記述する必要があります。異なるレベルに「foo」という名前のファイルがたくさんある場合、これは面倒です。サブディレクトリ ツリーの。

とにかく、私は除外ルールがどのように機能するかをよく理解していないか、ディレクトリが (ワイルドカードではなく) 無視されるとまったく機能しません - / で終わるルールによって

誰でもこれに光を当てることができますか?

この不器用なシェルベースの構文の代わりに、正規表現のような賢明なものを gitignore に使用させる方法はありますか?

Cygwin/bash3 では git-1.6.6.1、Ubuntu/bash3 では git-1.7.1 を使用して観察しています。

4

5 に答える 5

167
/a/b/c/*
!フー

私にはうまくいくようです(Linuxではgit 1.7.0.4)。*そうしないと、ディレクトリ内のファイル(除外が可能になる)ではなく、ディレクトリ自体を無視するため(gitは内部を調べません)、これは重要です。

除外は、「ただし、これを含める」ではなく、「ただし、これは含めない」と考えてください。「このディレクトリを無視する ( /a/b/c/) が、これは無視する ( foo)」というのはあまり意味がありません。/a/b/c/*「このディレクトリ ( )内のすべてのファイルを無視するが、これ ( ) は無視しないfoo」。マニュアルページを引用するには:

オプションのプレフィックス ! パターンを否定します。以前のパターンによって除外された一致するファイルは、再び含まれるようになります。

つまり、ファイルが再度含まれるには、既に除外されている必要があります。それがいくつかの光を当てることを願っています。

于 2010-06-08T23:00:44.277 に答える
25

私も同様の状況にあります。私の解決策は次を使用することでした。

/a/**/*
!/a/**/foo

**正しく読み取れば、任意の数の中間ディレクトリで機能するはずです。

于 2012-03-07T15:35:52.157 に答える
7

別のオプションは次のとおりです。

*
!/a*
!/a/*
!/a/*/*
!/a/*/*/*

これは、内の3レベルの深さのファイル/ディレクトリを除いて、すべてのファイルとディレクトリを無視します。

于 2011-02-06T00:18:27.440 に答える
6

これは、.gitignore の man ページからは明らかではありません。これは機能します:

*
!/a
!/a/b
!/a/b/c
!/a/b/c/foo

# don't forget this one
!.gitignore

Chris が述べたように、除外されている場合、ディレクトリは開かれません。したがって、一部のファイルを無視できるようにしたい場合は、上記のようにそれらのファイルへのパスを作成する必要があります。ライブラリの 1 つのファイルでコード レビューを行いたい場合、後で別のファイルを追加するだけで、他のすべては無視されるため、これは便利です。

于 2010-11-10T00:42:39.673 に答える
5

より一般的な注意として、git1.8.2には、ファイルを実際に無視するルールを決定するためのAdam Spiersからのパッチ(これもv4に、いくつかのスタック オーバーフローの質問によってプロンプトが表示されます)が含まれます。gitignore

git1.8.2 のリリース ノートと SO の質問「どの gitignore ルールがファイルを無視していますか」を参照してください。
それが command になりgit check-ignoreます。

于 2013-02-18T12:01:25.033 に答える