Update the tests and documentation to match the new "last one
determines its fate" semantics.
Signed-off-by: Junio C Hamano <junkio@cox.net>
per line. A line that starts with a '#' can be used as comment
for readability.
per line. A line that starts with a '#' can be used as comment
for readability.
-The list of patterns that is in effect at a given time is
-built and ordered in the following way:
+There are three lists of patterns that are in effect at a given
+time. They are built and ordered in the following way:
- * --exclude=<pattern> and lines read from --exclude-from=<file>
- come at the beginning of the list of patterns, in the order
- given on the command line. Patterns that come from the file
- specified with --exclude-from are ordered in the same order
- as they appear in the file.
+ * --exclude=<pattern> from the command line; patterns are
+ ordered in the same order as they appear on the command line.
+
+ * lines read from --exclude-from=<file>; patterns are ordered
+ in the same order as they appear in the file.
* When --exclude-per-directory=<name> is specified, upon
entering a directory that has such a file, its contents are
* When --exclude-per-directory=<name> is specified, upon
entering a directory that has such a file, its contents are
are popped off when leaving the directory.
Each pattern in the pattern list specifies "a match pattern" and
are popped off when leaving the directory.
Each pattern in the pattern list specifies "a match pattern" and
-optionally the fate --- either a file that matches the pattern
-is considered excluded or included. By default, this being
-"exclude" mechanism, the fate is "excluded". A filename is
-examined against the patterns in the list, and the first match
-determines its fate.
+optionally the fate;n either a file that matches the pattern is
+considered excluded or included. A filename is matched against
+the patterns in the three lists; the --exclude-from list is
+checked first, then the --exclude-per-directory list, and then
+finally the --exclude list. The last match determines its fate.
+If there is no match in the three lists, the fate is "included".
A pattern specified on the command line with --exclude or read
from the file specified with --exclude-from is relative to the
A pattern specified on the command line with --exclude or read
from the file specified with --exclude-from is relative to the
*.[oa]
$ cat Documentation/.gitignore
# ignore generated html files,
*.[oa]
$ cat Documentation/.gitignore
# ignore generated html files,
# except foo.html which is maintained by hand
!foo.html
# except foo.html which is maintained by hand
!foo.html
$ git-ls-files --ignored \
--exclude='Documentation/*.[0-9]' \
--exclude-from=.git/ignore \
$ git-ls-files --ignored \
--exclude='Documentation/*.[0-9]' \
--exclude-from=.git/ignore \
for dir in . one one/two three
do
mkdir -p $dir &&
for dir in . one one/two three
do
mkdir -p $dir &&
+ for i in 1 2 3 4 5 6 7 8
+one/two/a.7
+one/two/a.8
three/a.2
three/a.3
three/a.4
three/a.5
three/a.2
three/a.3
three/a.4
three/a.5
EOF
echo '.gitignore
output
expect
.gitignore
EOF
echo '.gitignore
output
expect
.gitignore
-two/*.4' >one/.gitignore
+two/*.4
+!*.7
+*.8' >one/.gitignore
+echo '!*.2
+!*.8' >one/two/.gitignore
- 'git-ls-files --others --exclude.' \
+ 'git-ls-files --others with various exclude options.' \
--exclude-per-directory=.gitignore \
--exclude-from=.git/ignore \
>output &&
--exclude-per-directory=.gitignore \
--exclude-from=.git/ignore \
>output &&