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

[PATCH] ignore: info/exclude should trump core.excludesfile

From
Junio C Hamano <gitster@pobox.com>
Date
Apr 22, 2015, 21:39 UTC
Message-ID
<xmqqvbgnderm.fsf@gitster.dls.corp.google.com>
In-Reply-To
<20150422150558.6326cb6152a306f028fb6ad3@gmail.com>

$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 896bdfa2 (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>
---
 * This is done on an old codebase and may not apply cleanly to more
   modern codebase easily.
 dir.c              | 10 +++++++---
 t/t0008-ignores.sh | 10 ++++++++++
 2 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/dir.c b/dir.c
index 23b6de4..e67b6f9 100644
--- a/dir.c
+++ b/dir.c
@@ -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)
diff --git a/t/t0008-ignores.sh b/t/t0008-ignores.sh
index b4d98e6..38405de 100755
--- a/t/t0008-ignores.sh
+++ b/t/t0008-ignores.sh
@@ -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
-- 
2.4.0-rc3-227-gd45ce82
Previous: Yohei Endo
Message 4 of 4 in “Wrong gitignore precedence?”
  1. Yohei EndoApr 22, 2015
  2. Junio C HamanoApr 22, 2015
  3. Yohei EndoApr 23, 2015
  4. ignore: info/exclude should trump core.excludesfileJunio C Hamano, Apr 22, 2015

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.