【问题标题】:Difference between ** and * in glob matching (.gitignore)全局匹配(.gitignore)中**和*之间的区别
【发布时间】:2012-01-12 09:31:33
【问题描述】:

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

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

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

但是,将以下模式添加到 .gitignore 并不能解决问题:

pw-spec/*.js
pw-spec/**/*.js

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

在做

ls pw-spec/**/*.js

产生 [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

如你所见

pw-spec/integration/service/auth_spec.js
pw-spec/integration/service/chat_spec.js
pw-spec/integration/service/transport_spec.js

[1] 中缺少。

【问题讨论】:

标签: git shell glob gitignore


【解决方案1】:

这种情况有两种方法,具体取决于您的需要。

一个解决办法是放

# generated files
*.js

在 pw-spec/.gitignore 中。

第二种解决方法是:

/pw-spec/*.js
/pw-spec/*/*.js
/pw-spec/*/*/*.js

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

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

【讨论】:

  • 此解决方案仍然有效,但截至 2013 年,您可以完全按照 OP 的尝试:pw-spec/**/*.js。见this answer
【解决方案2】:

不同之处在于** 不起作用,至少不是对所有人都有效。见

Why doesn't gitignore work in this case?

您可以在pw-spec/ 中拥有一个单独的.gitignore

【讨论】:

    【解决方案3】:

    pw-spec 中创建一个.gitignore,在其中插入这两行:

    *.js
    */*.js
    

    另请注意,如果您已经在此子目录中跟踪了想要“取消跟踪”的文件,则必须将它们设为索引未知:

    git rm --cached path/to/file
    

    例如,如果在目录pw-spec 你可以这样做:

    find -type f -name "*.js" | xargs git rm --cached
    

    【讨论】:

    • 我在pw-spec 中添加了.gitignore。但是,*.js 只匹配 pw-spec 的直接后代,而不匹配子目录中的 .js 文件。
    • 是的,我正在和.git/info/exclude混合......等等
    • 嗯,解决了。我将.gitignore 文件放在pw-spec 的父级中,因为还有另一个具有类似要求的目录(为简洁起见,我省略了它)。如果我找不到解决方案,我将简单地使用 2 个.gitignore 文件。
    • 也许尝试在根目录使用单个 .gitignore 并为一个目录 'x' 使用 'x/*.js' 和 'x/*/*.js'? (注:未经测试)
    • 那是我的第一次尝试,但没有成功。匹配深度不超过 1 级(事件与 **)。
    猜你喜欢
    • 2010-10-31
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多