glob匹配中的**和*之间的差异(.gitignore)

Emi*_*nov 19 git shell glob gitignore

我有以下目录结构和文件.

pw-spec/
|-- event_spec.coffee
|-- event_spec.js
|-- integration
|   `-- service
|       |-- auth_spec.coffee
|       |-- auth_spec.js
|       |-- chat_spec.coffee
|       |-- chat_spec.js
|       |-- transport_spec.coffee
|       `-- transport_spec.js
|-- message_spec.coffee
|-- message_spec.js
|-- pw_spec.coffee
|-- pw_spec.js
|-- run.coffee
|-- run.html
|-- run.js
|-- service
|   |-- auth_spec.coffee
|   |-- auth_spec.js
|   |-- chat_spec.coffee
|   |-- chat_spec.js
|   |-- stream_spec.coffee
|   `-- stream_spec.js
|-- spec.coffee
|-- spec.js
`-- stub
    |-- stream.coffee
    |-- stream.js
    |-- transport.coffee
    `-- transport.js

4 directories, 27 files
Run Code Online (Sandbox Code Playgroud)

我想忽略*.js目录中任何位置的所有文件pw-spec.

但是,添加以下模式.gitignore不会削减它:

pw-spec/*.js
pw-spec/**/*.js
Run Code Online (Sandbox Code Playgroud)

问题是第二个只匹配树中正好1级深的js文件,而我想匹配下的所有js文件pw-spec.

干

ls pw-spec/**/*.js
Run Code Online (Sandbox Code Playgroud)

产生[1]:

pw-spec/service/auth_spec.js
pw-spec/service/chat_spec.js
pw-spec/service/stream_spec.js
pw-spec/stub/stream.js
pw-spec/stub/transport.js
Run Code Online (Sandbox Code Playgroud)

如你看到的

pw-spec/integration/service/auth_spec.js
pw-spec/integration/service/chat_spec.js
pw-spec/integration/service/transport_spec.js
Run Code Online (Sandbox Code Playgroud)

在[1]中缺失.

Mis*_*iev 8

不同之处在于**它不起作用,至少不适合所有人.看到

为什么gitignore在这种情况下不起作用?

你可以单独.gitignore进去pw-spec/


Ben*_*tin 7

根据您的需要,这种情况有两种方法.

一个解决方案是放

# generated files
*.js
Run Code Online (Sandbox Code Playgroud)

在pw-spec/.gitignore中.

第二个解决方案是:

/pw-spec/*.js
/pw-spec/*/*.js
/pw-spec/*/*/*.js
Run Code Online (Sandbox Code Playgroud)

在主.gitignore文件中等等.如果添加更多子目录,这种方法很脆弱.

我通常更喜欢将.gitignore文件放在与生成我忽略的文件的Makefile相同的级别.

  • 此解决方案仍然有效,但截至 2013 年,您可以完全按照 OP 尝试的方式执行操作:`pw-spec/**/*.js`。请参阅[此答案](http://stackoverflow.com/a/1470664/5191105)。 (3认同)