为什么带有双星号的glob模式与子目录中的任何内容都不匹配?

4 git glob gitignore

我正在尝试编写.gitignore规则来排除具有多个子目录级别的特定目录中的某些文件.

文件夹结构如下所示:

out
??a
? ??source
? ? ??.keepme
? ? ??183597.txt
? ? ??271129.txt
? ? ??288833.txt
? ??parsed
?   ??.keepme
?   ??183597.csv
?   ??271129.csv
?   ??288833.csv
??b
? ??(...)

(etc.)
Run Code Online (Sandbox Code Playgroud)

我想保留.keepme文件(以便Git保存目录结构),所以我想我会写一个规则来匹配out与模式匹配的任何东西?*.*:

out/**/?*.*
Run Code Online (Sandbox Code Playgroud)

但是,这与任何文件都不匹配.

我认为这**将匹配任意数量的子目录; 为什么这不起作用?

我在Fedora 18 VM上运行Bash 4.2中的Git 1.8.

tha*_*guy 7

首先,请确保您使用的是Git 1.8.2或更高版本,因为这是在**引入支持时.

听起来你正试图.keepme通过匹配来排除文件*.*.但是,由于*匹配零个或多个字符,它匹配句点前面的空字符串.keepme,包括此文件.

也许你打算像它一样工作 out/**/?*.*

如果你想匹配所有非dotfiles,你可以使用out/**/[!.]*哪些也包括没有句号的文件名,比如Makefile.

  • 或者`out /**/[!.]*.*`,它将匹配包含句点且不以句点开头的任何内容. (2认同)