git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Gitignore documentation

From
Junio C Hamano <gitster@pobox.com>
Date
Jan 14, 2019, 18:47 UTC
Message-ID
<xmqqzhs3uldb.fsf@gitster-ct.c.googlers.com>
In-Reply-To
<CALZbgSQti+t2dA4nm+DCDGxQjsvNJy3UDdqAya16v+Mv5O4Xdw@mail.gmail.com>
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 "`/`"
Previous: Maris RazvanNext: Jonathan Nieder
Message 2 of 5 in “Gitignore documentation”
  1. Maris RazvanJan 12, 2019
  2. Junio C HamanoJan 14, 2019
  3. Jonathan NiederJan 14, 2019
  4. Junio C HamanoJan 14, 2019
  5. Duy NguyenJan 15, 2019

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.