大きなディレクトリ構造で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の両方を無視します。
機能する1つの状況は、ファイルa / b / c / .gitignoreを作成してそこに配置した場合です。
*
!foo
しかし、これの問題は、最終的にa / b / cの下に他のサブディレクトリがあり、個別の.gitignoreを1つ1つに配置する必要がないことです-「プロジェクトベース」の.gitignoreを作成することを望んでいました各プロジェクトの最上位ディレクトリに配置でき、すべての「標準」サブディレクトリ構造をカバーするファイル。
これも同等のようです:
a/b/c/*
!a/b/c/foo
これは私が達成できる「作業」に最も近いものかもしれませんが、完全な相対パスと明示的な例外を指定する必要があります。これは、さまざまなレベルで「foo」という名前のファイルが多数ある場合に苦痛になりますサブディレクトリツリーの。
とにかく、除外ルールのしくみがよくわからないか、/(ワイルドカードではなく)ディレクトリが/で終わるルールによって無視されたときにまったく機能しない
誰かがこれにいくつかの光を当てることができますか?
この不器用なシェルベースの構文の代わりに、正規表現のような賢明なものをgitignoreに使用させる方法はありますか?
私はこれをCygwin / bash3のgit-1.6.6.1およびUbuntu / bash3のgit-1.7.1で使用して観察しています。