[解決済み] .gitignoreの除外ルールは実際にどのように機能するのですか?
質問
大きなディレクトリ構造で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
)"がそうです。マニュアルページを引用します。
パターンを否定するオプションのプレフィックス !
すなわち ファイル は、すでに除外されていなければ、再び含まれることはありません。何かヒントがあるといいのですが。
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] コミット前に 'git add' を取り消すにはどうすればよいですか?
-
[解決済み] Git が追跡したファイルを .gitignore に登録したまま「忘れる」ようにするにはどうしたらいいですか?
-
[解決済み] git rebase の取り消し
-
[解決済み] Git リポジトリを特定のフォルダにクローンする方法は?
-
[解決済み] .gitignoreはGitによって無視されます。
-
[解決済み] git プロジェクト上の 'bin' ディレクトリを無視する
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
-
[解決済み】ローカルのGitブランチの名前を変更するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] あなたのブランチは 'origin/master' より 3 コミット進んでいます。
-
[解決済み] 警告: リモート HEAD は存在しない参照元を参照しているため、チェックアウトできません。
-
[解決済み] git リモートリポジトリには、ローカルブランチにマージされていないコミットが含まれています。
-
[解決済み] .gitignoreで一部のファイル以外を無視するようにする
-
[解決済み] .gitignoreでフォルダを除外し、特定のサブフォルダを含めることができます。
-
[解決済み] サブフォルダやサブディレクトリを無視するには?
-
[解決済み] どの gitignore ルールが私のファイルを無視しているのか説明してください。
-
[解決済み] [Solved] Gitにサブディレクトリ以外を無視させるには?
-
[解決済み] .gitignoreを使用して特定のディレクトリ以外を無視する
-
[解決済み] ドットのないファイル(拡張子のないファイル)をgitignoreファイルに追加するにはどうしたらいいですか?