ignore: note info/exclude lives in GIT_COMMON_DIR, not GIT_DIR

gitignore(5) says that the per-repository ignore file is
$GIT_DIR/info/exclude, but in a worktree that is not the case:

    git rev-parse --git-path info/exclude
    /path/to/main/worktree/.git/info/exclude
    git rev-parse --git-common-dir
    /path/to/main/worktree/.git

We actually use $GIT_COMMON_DIR/info/exclude. Adjust the documentation
and some code comments to say so.

Signed-off-by: D. Ben Knoble <ben.knoble+github@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
main
D. Ben Knoble 2026-05-12 17:21:43 -04:00 committed by Junio C Hamano
parent 94f057755b
commit bd40c65bbc
6 changed files with 13 additions and 13 deletions

View File

@ -331,7 +331,7 @@ can give `--exclude-per-directory=.gitignore`, and then specify:
1. The file specified by the `core.excludesfile` configuration
variable, if exists, or the `$XDG_CONFIG_HOME/git/ignore` file.

2. The `$GIT_DIR/info/exclude` file.
2. The `$GIT_COMMON_DIR/info/exclude` file.

via the `--exclude-from=` option.


View File

@ -439,7 +439,7 @@ Any other arguments are passed directly to 'git log'
'show-ignore'::
Recursively finds and lists the svn:ignore and svn:global-ignores
properties on directories. The output is suitable for appending to
the $GIT_DIR/info/exclude file.
the $GIT_COMMON_DIR/info/exclude file.

'mkdirs'::
Attempts to recreate empty directories that core Git cannot track

View File

@ -291,14 +291,14 @@ Git index format
sequence in variable width encoding. Each string describes the
environment where the cache can be used.

- Stat data of $GIT_DIR/info/exclude. See "Index entry" section from
- Stat data of $GIT_COMMON_DIR/info/exclude. See "Index entry" section from
ctime field until "file size".

- Stat data of core.excludesFile

- 32-bit dir_flags (see struct dir_struct)

- Hash of $GIT_DIR/info/exclude. A null hash means the file
- Hash of $GIT_COMMON_DIR/info/exclude. A null hash means the file
does not exist.

- Hash of core.excludesFile. A null hash means the file does

View File

@ -7,7 +7,7 @@ gitignore - Specifies intentionally untracked files to ignore

SYNOPSIS
--------
$XDG_CONFIG_HOME/git/ignore, $GIT_DIR/info/exclude, .gitignore
$XDG_CONFIG_HOME/git/ignore, $GIT_COMMON_DIR/info/exclude, .gitignore

DESCRIPTION
-----------
@ -34,7 +34,7 @@ precedence, the last matching pattern decides the outcome):
includes such `.gitignore` files in its repository, containing patterns for
files generated as part of the project build.

* Patterns read from `$GIT_DIR/info/exclude`.
* Patterns read from `$GIT_COMMON_DIR/info/exclude`.

* Patterns read from the file specified by the configuration
variable `core.excludesFile`.
@ -50,7 +50,7 @@ be used.
specific to a particular repository but which do not need to be shared
with other related repositories (e.g., auxiliary files that live inside
the repository but are specific to one user's workflow) should go into
the `$GIT_DIR/info/exclude` file.
the `$GIT_COMMON_DIR/info/exclude` file.

* Patterns which a user wants Git to
ignore in all situations (e.g., backup or temporary files generated by
@ -97,7 +97,7 @@ PATTERN FORMAT
match at any level below the `.gitignore` level.

- Patterns read from exclude sources that are outside the working tree,
such as $GIT_DIR/info/exclude and core.excludesFile, are treated as if
such as $GIT_COMMON_DIR/info/exclude and core.excludesFile, are treated as if
they are specified at the root of the working tree, i.e. a leading "/"
in such patterns anchors the match at the root of the repository.

@ -146,8 +146,8 @@ CONFIGURATION

The optional configuration variable `core.excludesFile` indicates a path to a
file containing patterns of file names to exclude, similar to
`$GIT_DIR/info/exclude`. Patterns in the exclude file are used in addition to
those in `$GIT_DIR/info/exclude`.
`$GIT_COMMON_DIR/info/exclude`. Patterns in the exclude file are used in
addition to those in `$GIT_COMMON_DIR/info/exclude`.

NOTES
-----

4
dir.c
View File

@ -2985,7 +2985,7 @@ static struct untracked_cache_dir *validate_untracked_cache(struct dir_struct *d
return NULL;

/*
* We only support $GIT_DIR/info/exclude and core.excludesfile
* We only support $GIT_COMMON_DIR/info/exclude and core.excludesfile
* as the global ignore rule files. Any other additions
* (e.g. from command line) invalidate the cache. This
* condition also catches running setup_standard_excludes()
@ -3078,7 +3078,7 @@ static struct untracked_cache_dir *validate_untracked_cache(struct dir_struct *d
istate->cache_changed |= UNTRACKED_CHANGED;
}

/* Validate $GIT_DIR/info/exclude and core.excludesfile */
/* Validate $GIT_COMMON_DIR/info/exclude and core.excludesfile */
root = dir->untracked->root;
if (!oideq(&dir->internal.ss_info_exclude.oid,
&dir->untracked->ss_info_exclude.oid)) {

2
dir.h
View File

@ -153,7 +153,7 @@ struct oid_stat {
* - The list of files and directories of the directory in question
* - The $GIT_DIR/index
* - dir_struct flags
* - The content of $GIT_DIR/info/exclude
* - The content of $GIT_COMMON_DIR/info/exclude
* - The content of core.excludesfile
* - The content (or the lack) of .gitignore of all parent directories
* from $GIT_WORK_TREE