Junio C Hamano <gits...@pobox.com> writes:

> We need documentation update to settle this one before 2.8 final
> ships, as we seem to be seeing more and more end-user confusion on
> the list.  I tried to come up with a trimmed-down example, which is
> shown below, but I suspect that the code is not exactly working the
> way it is described in that (1) dir/file1 is ignored and (3)
> !dir/file3 entry makes difference.
>
> Where did my example go wrong?
>
> FYI, if I prefix '/' to all the .gitignore entries in the example, i.e.
> making it
>
>     *
>     !/dir
>     /dir/file2
>     !/dir/file3
>
> instead, then dir/file1 and dir/file3 do get shown as unignored.
>
> If it is documented somewhere, then I can update the example and
> declare victory (but then the text that accompanies the example
> still needs to remind the readers why the leading '/' matters.

I also found that having an extra slash at the end of the
"everything underneath 'dir' directory is included", i.e.

     *
     !/dir/
     /dir/file2
     !/dir/file3

breaks it.  dir/file1 is ignored, dir/file3 isn't but the latter is
only because there is an explicit !/dir/file3.  This is contrary to
this rule in the documentation:

 - If the pattern ends with a slash, it is removed for the
   purpose of the following description, but it would only find
   a match with a directory.  In other words, `foo/` will match a
   directory `foo` and paths underneath it, but will not match a
   regular file or a symbolic link `foo` (this is consistent
   with the way how pathspec works in general in Git).

In other words, '!/dir/' does not seem to match the directory dir
and paths underneath it.

Thanks.

>  Documentation/gitignore.txt | 34 ++++++++++++++++++++++++++++++++++
>  1 file changed, 34 insertions(+)
>
> diff --git a/Documentation/gitignore.txt b/Documentation/gitignore.txt
> index 3ded6fd..b841233 100644
> --- a/Documentation/gitignore.txt
> +++ b/Documentation/gitignore.txt
> @@ -150,6 +150,40 @@ excluded, the following conditions must be met:
>   - The directory part in the re-include rules must be literal (i.e. no
>     wildcards)
>  
> +A re-inclusion of a directory makes all files in the directory
> +unignored.  For example, suppose you have files `.gitignore`,
> +`dir/file1`, `dir/file2`, and `dir/file3`, and have the following in
> +your `.gitignore`:
> +
> +----------------
> +*
> +!dir
> +# dir/file1 is not mentioned in .gitignore
> +dir/file2
> +!dir/file3
> +----------------
> +
> +Then:
> +
> + - `.gitignore` gets ignored, because it matches the `*` at the top
> +   level;
> +
> + - `dir/file1` gets unignored, because `dir` marks everything
> +   underneath `dir/` to be unignored unless otherwise specified;
> +
> + - `dir/file2` gets ignored, because `dir/file2` is listed to be
> +   ignored;
> +
> + - `dir/file3` gets unignored, because `dir/file3` is listed to be
> +   ignored.  Note that the entry `!dir/file3` is redundant because
> +   everything underneath `dir/` is marked to be unignored already.
> +
> +Some earlier versions of Git treated `!dir` differently in that it
> +did not cause the paths under it unignored, but this has been
> +corrected to be consistent with `dir` that says "`dir` and everything
> +below are ignored."
> +
> +
>  EXAMPLES
>  --------
>  
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to