threads / discuss / 50206

Gitignore documentation

Subject: Gitignore documentation

## tl;dr

5 messages between Jan 12, 2019 and Jan 15, 2019.

replies: 4people: 4as markdown or json

Maris Razvan· Jan 12, 2019, 20:16 UTC · lore
Hello,

I was reading the gitignore documentation (https://git-scm.com/docs/gitignore), especially the following paragraph:

         "If the pattern does not contain a slash /, Git treats it as
a shell glob pattern and checks for a match against the pathname
relative to the location of the .gitignore file (relative to the
toplevel of the work tree if not from a .gitignore file)."

From that paragraph I understand that if I have the following directory structure:

        .gitignore
        a
            f

(the root of the repository contains the file .gitignore and the folder a, while the file f is inside folder a) where the file .gitignore contains only the pattern f, when file "f" is tested whether it should be ignored or not, the pattern f in .gitignore is matched against the "pathname relative to the location of the .gitignore file" (which is a/f). Because "f" (the pattern) does not match "a/f" (the pathname relative to the location of .gitignore), the file "f" should not be ignored. However, if I test this scenario, git ignores the file (this behaviour is consistent with the examples from the rest of the documentation and other explanations on the internet).

I looked at the history of the "Documentation/gitignore.txt" file on the github repository and I saw that initially the paragraph looked like this:

        "If the pattern does not contain a slash '/', git treats it as
a shell glob pattern and checks for a match against the pathname
without leading directories."
This old version of the paragraph is consistent with git's current behaviour.

Then I saw the following commit https://github.com/git/git/commit/81c13fde379c46cad6b6e4a03ed7ee4f686c030f#diff-7fea460d44f92f185e7add8aa5620305, which changed that paragraph to the current version. However, I cannot see how the two wordings (the original one and the current one) are the same.

I would really appreciate if someone could explain how to read the current version of the paragraph such that it is consistent with git's behaviour.

Thank you, Razvan Maris

Junio C Hamano· Jan 14, 2019, 18:47 UTC · re: Maris Razvan · lore

Re: Gitignore documentation

Maris Razvan <razvan.alex.maris@gmail.com> writes:
Show 43 quoted lines
> I was reading the gitignore documentation
> (https://git-scm.com/docs/gitignore), especially the following
> paragraph:
>
>          "If the pattern does not contain a slash /, Git treats it as
> a shell glob pattern and checks for a match against the pathname
> relative to the location of the .gitignore file (relative to the
> toplevel of the work tree if not from a .gitignore file)."
>
> From that paragraph I understand that if I have the following
> directory structure:
>
>         .gitignore
>         a
>             f
>
> (the root of the repository contains the file .gitignore and the
> folder a, while the file f is inside folder a)
> where the file .gitignore contains only the pattern f, when file "f"
> is tested whether it should be ignored or not, the pattern f in
> .gitignore is matched against the "pathname relative to the location
> of the .gitignore file" (which is a/f). Because "f" (the pattern) does
> not match "a/f" (the pathname relative to the location of .gitignore),
> the file "f" should not be ignored. However, if I test this scenario,
> git ignores the file (this behaviour is consistent with the examples
> from the rest of the documentation and other explanations on the
> internet).
>
> I looked at the history of the "Documentation/gitignore.txt" file on
> the github repository and I saw that initially the paragraph looked
> like this:
>
>         "If the pattern does not contain a slash '/', git treats it as
> a shell glob pattern and checks for a match against the pathname
> without leading directories."
>
> This old version of the paragraph is consistent with git's current behaviour.
>
> Then I saw the following commit
> https://github.com/git/git/commit/81c13fde379c46cad6b6e4a03ed7ee4f686c030f#diff-7fea460d44f92f185e7add8aa5620305,
> which changed that paragraph to the current version.
> However, I cannot see how the two wordings (the original one and the
> current one) are the same.
Thanks.

Jonathan, after re-reading 81c13fde ("gitignore.5: Clarify matching rules", 2010-03-05), I do not recall why we thought this part of the change was a good idea, either. Patterns with slash is anchored at one directory, and that directory is the one that has per-directory .gitignore file. Patterns without slash (including a pattern that ends with but otherwise has no other slash) are supposed to match at every level below the directory that the pattern is defined in.

 Documentation/gitignore.txt | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/Documentation/gitignore.txt b/Documentation/gitignore.txt
index 1c94f08ff4..bf1182169e 100644
--- a/Documentation/gitignore.txt
+++ b/Documentation/gitignore.txt
@@ -98,9 +98,7 @@ PATTERN FORMAT
 
  - If the pattern does not contain a slash '/', Git treats it as
    a shell glob pattern and checks for a match against the
-   pathname relative to the location of the `.gitignore` file
-   (relative to the toplevel of the work tree if not from a
-   `.gitignore` file).
+   pathname without leading directories.
 
  - Otherwise, Git treats the pattern as a shell glob: "`*`" matches
    anything except "`/`", "`?`" matches any one character except "`/`"
Jonathan Nieder· Jan 14, 2019, 21:38 UTC · re: Junio C Hamano · lore

Re: Gitignore documentation

Hi,
Junio C Hamano wrote:
Show 5 quoted lines
>                                  Patterns with slash is anchored at
> one directory, and that directory is the one that has per-directory
> .gitignore file.  Patterns without slash (including a pattern that
> ends with but otherwise has no other slash) are supposed to match at
> every level below the directory that the pattern is defined in.

I had a sense of deja vu, and found https://public-inbox.org/git/20111107080926.GC30486@elie.hsd1.il.comcast.net/

Any idea what happened there? Would it be useful for me to rebase and revive that series?

Thanks, Jonathan

Junio C Hamano· Jan 14, 2019, 21:52 UTC · re: Jonathan Nieder · lore

Re: Gitignore documentation

Jonathan Nieder <jrnieder@gmail.com> writes:
> https://public-inbox.org/git/20111107080926.GC30486@elie.hsd1.il.comcast.net/
>
> Any idea what happened there?  Would it be useful for me to rebase
> and revive that series?
No idea what happend there.

Anyway, I quickly read them over and found nothing questionable, except perhaps the moving of "slash is dropped for the purpose of the remaining rules" in 1/4 were probably not a great idea (IOW, I found that it leaves a stronger impression to the readers to say it upfront in the paragraph), but I do not think it is a show-stopper.

Reviving the topic would indeed be a good idea.
Thanks.
Duy Nguyen· Jan 15, 2019, 09:27 UTC · re: Jonathan Nieder · lore

Re: Gitignore documentation

On Tue, Jan 15, 2019 at 4:38 AM Jonathan Nieder <jrnieder@gmail.com> wrote:
Show 16 quoted lines
>
> Hi,
>
> Junio C Hamano wrote:
>
> >                                  Patterns with slash is anchored at
> > one directory, and that directory is the one that has per-directory
> > .gitignore file.  Patterns without slash (including a pattern that
> > ends with but otherwise has no other slash) are supposed to match at
> > every level below the directory that the pattern is defined in.
>
> I had a sense of deja vu, and found
> https://public-inbox.org/git/20111107080926.GC30486@elie.hsd1.il.comcast.net/
>
> Any idea what happened there?  Would it be useful for me to rebase
> and revive that series?

I don't remember what happened either. But yeah it's always good to improve this text.

-- 
Duy

← back to recent threads