在Ryan Bates'Railscast about git中,他的 .gitignore 文件包含以下行:
tmp/**/*
使用双星号后跟星号的目的是什么:**/*
?
简单地使用tmp/*
代替tmp/**/*
会不会达到完全相同的结果吗?
谷歌搜索这个问题,我发现了一篇关于它的不太明确的IBM文章,我想知道是否有人可以澄清这个问题。
答案 0 :(得分:25)
它表示要进入tmp以下的所有子目录,以及tmp的内容。
e.g。我有以下内容:
$ find tmp
tmp
tmp/a
tmp/a/b
tmp/a/b/file1
tmp/b
tmp/b/c
tmp/b/c/file2
匹配输出:
$ echo tmp/*
tmp/a tmp/b
匹配输出:
$ echo tmp/**/*
tmp/a tmp/a/b tmp/a/b/file1 tmp/b tmp/b/c tmp/b/c/file2
这是zsh的默认功能,为了让它在bash 4中运行,你执行:
shopt -s globstar
答案 1 :(得分:5)
来自http://blog.privateergroup.com/2010/03/gitignore-file-for-android-development/:
(kwoods)
"The double asterisk (**) is not a git thing per say, it’s really a linux / Mac shell thing.
It would match on everything including any sub folders that had been created.
You can see the effect in the shell like so:
# ls ./tmp/* = should show you the contents of ./tmp (files and folders)
# ls ./tmp/** = same as above, but it would also go into each sub-folder and show the contents there as well."
答案 2 :(得分:1)
根据the documentation of gitignore,自git版本1.8.2起支持此语法。
以下是相关部分:
与完整路径名匹配的模式中的两个连续星号(
**
)可能具有特殊含义:
前导
**
后跟斜杠表示所有目录都匹配。例如,**/foo
在任何地方匹配文件或目录foo
与模式foo
相同。**/foo/bar
匹配文件或目录bar
直接位于目录foo
下的任何地方。尾随
/**
匹配内部的所有内容。例如,abc/**
匹配目录abc
内的所有文件,相对于其位置.gitignore
文件,无限深度。斜杠后跟两个连续的星号,然后斜杠匹配零个或多个目录。例如,
a/**/b
匹配a/b
,a/x/b
,a/x/y/b
等等。其他连续的星号被视为无效。