ignore: info/exclude should trump core.excludesfile
authorJunio C Hamano <gitster@pobox.com>
Wed, 22 Apr 2015 21:31:49 +0000 (14:31 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 22 Apr 2015 21:31:49 +0000 (14:31 -0700)
$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>
dir.c
t/t0008-ignores.sh
diff --git a/dir.c b/dir.c
index 23b6de47036839ca4297a9b93d1a9794547ccff1..e67b6f9b8bf95b284ee6976f4968eba80e281b8d 100644 (file)
--- 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)
index b4d98e602f7422009599e58f0a7ae943476b1c7e..38405de17d6f9625a07080d4fc2e4b4541351cc5 100755 (executable)
@@ -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