大きなディレクトリ構造で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 を使用して観察しています。