4

.gitignore複数レベルのサブディレクトリを持つ特定のディレクトリ内の一部のファイルを除外するルールを作成しようとしています。

フォルダ構造は次のようになります。

out
├─a
│ ├─source
│ │ ├─.keepme
│ │ ├─183597.txt
│ │ ├─271129.txt
│ │ └─288833.txt
│ └─parsed
│   ├─.keepme
│   ├─183597.csv
│   ├─271129.csv
│   └─288833.csv
├─b
│ └─(...)

(etc.)

(Git がディレクトリ構造を保存するように) ファイルを保持したいので、次のパターンに一致する.keepmeものに一致するルールを作成します。out?*.*

out/**/?*.*

ただし、これはどのファイルとも一致しません。

**任意の数のサブディレクトリに一致すると思いました。なぜこれが機能しないのですか?

Fedora 18 VM の Bash 4.2 で Git 1.8 を実行しています。

4

2 に答える 2

8

最初に、Git 1.8.2 以降を使用していることを確認してください。これは、**サポートが導入されたときです。

.keepmeを一致させてファイルを除外しようとしているようです*.*。ただし、*0 個以上の文字に一致するため、.keepmeこのファイルも含めて のピリオドの前の空文字列に一致します。

多分あなたはそれが次のように動作することを意図していましたout/**/?*.*

ドット以外のすべてのファイルに一致させたい場合は、 which を使用out/**/[!.]*して、Makefile.

于 2013-07-01T20:38:02.290 に答える
0

他の人の答えは良いリードだと思います。patternout/**/[!.]*.*は、ピリオドを含み、ピリオドで始まらないすべてのものに一致する必要があり、bash、Arch Linux での私のテストでも機能します。

$ find * -type f
out/a/source/4232352.txt
out/a/source/1312312.txt
out/a/source/4234234.txt
out/a/source/.keepme
out/a/parsed/1231222.csv
out/a/parsed/9593343.csv
out/a/parsed/5675675.csv
out/a/parsed/.keepme
$ cat .gitignore
out/**/[!.]*.*

$ git init && git add -A && git status --ignored
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   .gitignore
#   new file:   out/a/parsed/.keepme
#   new file:   out/a/source/.keepme
#
# Ignored files:
#   (use "git add -f <file>..." to include in what will be committed)
#
#   out/a/parsed/1231222.csv
#   out/a/parsed/5675675.csv
#   out/a/parsed/9593343.csv
#   out/a/source/1312312.txt
#   out/a/source/4232352.txt
#   out/a/source/4234234.txt

編集: これは実際には Windows バージョンの git にバンドルされている git bash では機能しないようです。上記のファイルはいずれも this によって無視されません.gitignore

于 2013-07-01T20:43:40.543 に答える