]> git.ipfire.org Git - thirdparty/git.git/commitdiff
alias: treat empty subsection [alias ""] as plain [alias]
authorJonatan Holmgren <jonatan@jontes.page>
Thu, 26 Feb 2026 20:53:27 +0000 (21:53 +0100)
committerJunio C Hamano <gitster@pobox.com>
Thu, 26 Feb 2026 21:06:49 +0000 (13:06 -0800)
When git-config stores a key of the form alias..name, it records
it under an empty subsection ([alias ""]). The new subsection-aware
alias lookup would see a non-NULL but zero-length subsection and
fall into the subsection code path, where it required a "command"
key and thus silently ignored the entry.

Normalize an empty subsection to NULL before any further processing
so that entries stored this way continue to work as plain
case-insensitive aliases, matching the pre-subsection behaviour.

Users who relied on alias..name to create an alias literally named
".name" may want to migrate to subsection syntax, which looks less confusing:

    [alias ".name"]
        command = <value>

Add tests covering both the empty-subsection compatibility case and
the leading-dot alias via the new syntax.

Signed-off-by: Jonatan Holmgren <jonatan@jontes.page>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
alias.c
t/t0014-alias.sh

diff --git a/alias.c b/alias.c
index 0d636278bc1d11afbf3efda56fdcf679c63e8031..ec9833dd30f3cd0be4ac0e0da1b541cda67e2463 100644 (file)
--- a/alias.c
+++ b/alias.c
@@ -30,6 +30,10 @@ static int config_alias_cb(const char *var, const char *value,
         * - [alias "name"]
         *       command = value  (with subsection, case-sensitive)
         */
+       /* Treat [alias ""] (empty subsection) the same as plain [alias]. */
+       if (subsection && !subsection_len)
+               subsection = NULL;
+
        if (subsection && strcmp(key, "command"))
                return 0;
 
index 34bbdb51c519ed268723d66d0d43984ce2f24077..68b4903cbfa595b528a17559cf7dc17121fa1e9c 100755 (executable)
@@ -183,4 +183,18 @@ test_expect_success 'subsection aliases listed in help -a' '
        test_grep "förgrena" output
 '
 
+test_expect_success 'empty subsection treated as no subsection' '
+       test_config "alias..something" "!echo foobar" &&
+       git something >actual &&
+       echo foobar >expect &&
+       test_cmp expect actual
+'
+
+test_expect_success 'alias with leading dot via subsection syntax' '
+       test_config alias.".something".command "!echo foobar" &&
+       git .something >actual &&
+       echo foobar >expect &&
+       test_cmp expect actual
+'
+
 test_done