aboutsummaryrefslogtreecommitdiff
path: root/Documentation
diff options
context:
space:
mode:
authorJonatan Holmgren <jonatan@jontes.page>2026-02-18 22:57:36 +0100
committerJunio C Hamano <gitster@pobox.com>2026-02-19 10:13:20 -0800
commitac1f12a9de4b79b176a08f524fecdb092ff00e74 (patch)
treed0f7e02551c6307e00c7e7a3e23c4f19cb1e8a22 /Documentation
parent2ad33ea6b5c0a5670a757c9b594cc07321324e80 (diff)
downloadgit-ac1f12a9de4b79b176a08f524fecdb092ff00e74.tar.xz
alias: support non-alphanumeric names via subsection syntax
Git alias names are limited to ASCII alphanumeric characters and dashes because aliases are implemented as config variable names. This prevents aliases being created in languages using characters outside that range. Add support for arbitrary alias names by using config subsections: [alias "förgrena"] command = branch The subsection name is matched as-is (case-sensitive byte comparison), while the existing definition without a subsection (e.g., "[alias] co = checkout") remains case-insensitive for backward compatibility. This uses existing config infrastructure since subsections already support arbitrary bytes, and avoids introducing Unicode normalization. Also teach the help subsystem about the new syntax so that "git help -a" properly lists subsection aliases and the autocorrect feature can suggest them. Use utf8_strwidth() instead of strlen() for column alignment so that non-ASCII alias names display correctly. Suggested-by: Jeff King <peff@peff.net> Signed-off-by: Jonatan Holmgren <jonatan@jontes.page> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'Documentation')
-rw-r--r--Documentation/config/alias.adoc50
1 files changed, 42 insertions, 8 deletions
diff --git a/Documentation/config/alias.adoc b/Documentation/config/alias.adoc
index 80ce17d2de..115fdbb1e3 100644
--- a/Documentation/config/alias.adoc
+++ b/Documentation/config/alias.adoc
@@ -1,12 +1,46 @@
alias.*::
- Command aliases for the linkgit:git[1] command wrapper - e.g.
- after defining `alias.last = cat-file commit HEAD`, the invocation
- `git last` is equivalent to `git cat-file commit HEAD`. To avoid
- confusion and troubles with script usage, aliases that
- hide existing Git commands are ignored except for deprecated
- commands. Arguments are split by
- spaces, the usual shell quoting and escaping are supported.
- A quote pair or a backslash can be used to quote them.
+alias.*.command::
+ Command aliases for the linkgit:git[1] command wrapper. Aliases
+ can be defined using two syntaxes:
++
+--
+1. Without a subsection, e.g., `[alias] co = checkout`. The alias
+ name ("co" in this example) is
+ limited to ASCII alphanumeric characters and `-`,
+ and is matched case-insensitively.
+2. With a subsection, e.g., `[alias "co"] command = checkout`. The
+ alias name can contain any characters (except for newlines and NUL bytes),
+ including UTF-8, and is matched case-sensitively as raw bytes.
+ You define the action of the alias in the `command`.
+--
++
+Examples:
++
+----
+# Without subsection (ASCII alphanumeric and dash only)
+[alias]
+ co = checkout
+ st = status
+
+# With subsection (allows any characters, including UTF-8)
+[alias "hämta"]
+ command = fetch
+[alias "rätta till"]
+ command = commit --amend
+----
++
+With a Git alias defined, e.g.,
+
+ $ git config --global alias.last "cat-file commit HEAD"
+ # Which is equivalent to
+ $ git config --global alias.last.command "cat-file commit HEAD"
+
+`git last` is equivalent to `git cat-file commit HEAD`. To avoid
+confusion and troubles with script usage, aliases that
+hide existing Git commands are ignored except for deprecated
+commands. Arguments are split by
+spaces, the usual shell quoting and escaping are supported.
+A quote pair or a backslash can be used to quote them.
+
Note that the first word of an alias does not necessarily have to be a
command. It can be a command-line option that will be passed into the