Skip to content

Commit

Permalink
ignore: info/exclude should trump core.excludesfile
Browse files Browse the repository at this point in the history
$GIT_DIR/info/exclude and core.excludesfile (which falls back to
$XDG_HOME/git/ignore) are both ways to override the ignore pattern
lists given by the project in .gitignore files.  The former, which
is per-repository personal preference, should take precedence over
the latter, which is a personal preference default across different
repositories that are accessed from that machine.  The existing
documentation also agrees.

However, the precedence order was screwed up between these two from
the very beginning when 896bdfa (add: Support specifying an
excludes file with a configuration variable, 2007-02-27) introduced
core.excludesfile variable.

Noticed-by: Yohei Endo <yoheie@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Junio C Hamano committed Apr 22, 2015
1 parent 3d8a54e commit 099d2d8
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 3 deletions.
10 changes: 7 additions & 3 deletions dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -1530,15 +1530,19 @@ void setup_standard_excludes(struct dir_struct *dir)
char *xdg_path;

dir->exclude_per_dir = ".gitignore";
path = git_path("info/exclude");

/* core.excludefile defaulting to $XDG_HOME/git/ignore */
if (!excludes_file) {
home_config_paths(NULL, &xdg_path, "ignore");
excludes_file = xdg_path;
}
if (!access_or_warn(path, R_OK, 0))
add_excludes_from_file(dir, path);
if (excludes_file && !access_or_warn(excludes_file, R_OK, 0))
add_excludes_from_file(dir, excludes_file);

/* per repository user preference */
path = git_path("info/exclude");
if (!access_or_warn(path, R_OK, 0))
add_excludes_from_file(dir, path);
}

int remove_path(const char *name)
Expand Down
10 changes: 10 additions & 0 deletions t/t0008-ignores.sh
Original file line number Diff line number Diff line change
Expand Up @@ -775,4 +775,14 @@ test_expect_success PIPE 'streaming support for --stdin' '
echo "$response" | grep "^:: two"
'

test_expect_success 'info/exclude trumps core.excludesfile' '
echo >>global-excludes usually-ignored &&
echo >>.git/info/exclude "!usually-ignored" &&
>usually-ignored &&
echo "?? usually-ignored" >expect &&
git status --porcelain usually-ignored >actual &&
test_cmp expect actual
'

test_done

0 comments on commit 099d2d8

Please sign in to comment.