4

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

文件夹结构如下所示:

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

(etc.)

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

out/**/?*.*

但是,这不匹配任何文件。

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

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

4

2 回答 2

8

首先,确保您使用的是 Git 1.8.2 或更高版本,因为那**是引入支持的时候。

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

也许你打算让它像out/**/?*.*

如果您想匹配所有非点文件,您可以使用out/**/[!.]*which 还将包含其中不带句点的文件名,例如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 回答