diff --git a/dir.c b/dir.c
index 0c38d860144..4183acc0826 100644
--- a/dir.c
+++ b/dir.c
@@ -1673,13 +1673,17 @@ void setup_standard_excludes(struct dir_struct *dir)
 	const char *path;
 
 	dir->exclude_per_dir = ".gitignore";
-	path = git_path("info/exclude");
+
+	/* core.excludefile defaulting to $XDG_HOME/git/ignore */
 	if (!excludes_file)
 		excludes_file = xdg_config_home("ignore");
-	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 8dc6939b904..4ef5ed484c1 100755
--- a/t/t0008-ignores.sh
+++ b/t/t0008-ignores.sh
@@ -831,4 +831,14 @@ test_expect_success !MINGW,!CYGWIN 'correct handling of backslashes' '
 	test_cmp err.expect err
 '
 
+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