In Ryan Bates\' Railscast about git, his .gitignore file contains the following line:
tmp/**/*
What is the purpose of using the double
According to the documentation of gitignore, this syntax is supported since git version 1.8.2.
Here is the relevant section:
Two consecutive asterisks (
**) in patterns matched against full pathname may have special meaning:
A leading
**followed by a slash means match in all directories. For example,**/foomatches file or directoryfooanywhere, the same as patternfoo.**/foo/barmatches file or directorybaranywhere that is directly under directoryfoo.A trailing
/**matches everything inside. For example,abc/**matches all files inside directoryabc, relative to the location of the.gitignorefile, with infinite depth.A slash followed by two consecutive asterisks then a slash matches zero or more directories. For example,
a/**/bmatchesa/b,a/x/b,a/x/y/band so on.Other consecutive asterisks are considered invalid.
From 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."
It says to go into all the subdirectories below tmp, as well as just the content of tmp.
e.g. I have the following:
$ find tmp
tmp
tmp/a
tmp/a/b
tmp/a/b/file1
tmp/b
tmp/b/c
tmp/b/c/file2
matched output:
$ echo tmp/*
tmp/a tmp/b
matched output:
$ echo tmp/**/*
tmp/a tmp/a/b tmp/a/b/file1 tmp/b tmp/b/c tmp/b/c/file2
It is a default feature of zsh, to get it to work in bash 4, you perform:
shopt -s globstar