1. ホーム
  2. git

[解決済み] .gitignoreの除外ルールは実際にどのように機能するのですか?

2022-04-26 13:31:20

質問

大きなディレクトリ構造で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 の中のすべてを無視する .gitignore ファイルを作成することですが、ファイル 'foo' を無視することはありません。

こうして.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というファイルを作って、そこに入れるとうまくいくことがあります。

*
!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 で使用・観測しています。

解決方法は?

/a/b/c/*
!フー

私のところではうまくいっているようです (Linux 上の git 1.7.0.4).その * は重要です。そうしないと、ディレクトリ内のファイル(除外を可能にする)ではなく、ディレクトリ自体を無視することになるからです。

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

<ブロッククオート

パターンを否定するオプションのプレフィックス !

すなわち ファイル は、すでに除外されていなければ、再び含まれることはありません。何かヒントがあるといいのですが。