From: "Ralf Thielow" <>
If option --help is passed to a Git command, we try to open
the man page of that command. However, we do it even for commands
we don't know.  Make sure the command is known to Git before try
to open the man page.  If we don't know the command, give the
usual advice.

I'm still not sure this is enough. One of the problems back when I introduced the --guides option (65f9835 (builtin/help.c: add --guide option, 2013-04-02)) was that we had no easy way of determining what guides were available, especially given the *nix/Windows split where the help defaults are different (--man/--html).

At the time[1] we (I) punted on trying to determine which guides were actually installed, and just created a short list of the important guides, which I believe you now check. However the less common guides are still there (gitcvs-migration?), and others may be added locally.

One option may be to report that "no command or common guide found, will search for other guide (may fail)", which at least allows you to check the command list first, and then the common guide list, and only then warn (option?), and finally go on the rabbit hunt (possibly fruitless) for the missing guide (we've already decided it can't be a command!)


[1] (V3) plus previous discussions (V2) see note
Patch 6 - 13:
All dropped.
Drop the separate guide list.txt and extraction script, which was
copied from the common command list and script. If the guide usage
list is useful, extend the command-list.txt and
at a later date (V1) the original series

Signed-off-by: Ralf Thielow <>
Changes in v2:
- not only check for commands but also for guides
- use the command assumed by "help_unknown_cmd"

builtin/help.c  | 34 +++++++++++++++++++++++++++-------
t/ | 15 +++++++++++++++
2 files changed, 42 insertions(+), 7 deletions(-)
create mode 100755 t/

diff --git a/builtin/help.c b/builtin/help.c
index 8848013..7d2110e 100644
--- a/builtin/help.c
+++ b/builtin/help.c
@@ -433,10 +433,35 @@ static void list_common_guides_help(void)

+static int is_common_guide(const char* cmd)
+ int i;
+ for (i = 0; i < ARRAY_SIZE(common_guides); i++)
+ if (!strcmp(cmd, common_guides[i].name))
+ return 1;
+ return 0;
+static const char* check_git_cmd(const char* cmd)
+ char *alias;
+ if (is_git_command(cmd) || is_common_guide(cmd))
+ return cmd;
+ alias = alias_lookup(cmd);
+ if (alias) {
+ printf_ln(_("`git %s' is aliased to `%s'"), cmd, alias);
+ free(alias);
+ exit(0);
+ } else
+ return help_unknown_cmd(cmd);
int cmd_help(int argc, const char **argv, const char *prefix)
 int nongit;
- char *alias;
 enum help_format parsed_help_format;

 argc = parse_options(argc, argv, prefix, builtin_help_options,
@@ -476,12 +501,7 @@ int cmd_help(int argc, const char **argv, const char *prefix)
 if (help_format == HELP_FORMAT_NONE)
 help_format = parse_help_format(DEFAULT_HELP_FORMAT);

- alias = alias_lookup(argv[0]);
- if (alias && !is_git_command(argv[0])) {
- printf_ln(_("`git %s' is aliased to `%s'"), argv[0], alias);
- free(alias);
- return 0;
- }
+ argv[0] = check_git_cmd(argv[0]);

 switch (help_format) {
diff --git a/t/ b/t/
new file mode 100755
index 0000000..0dab88d
--- /dev/null
+++ b/t/
@@ -0,0 +1,15 @@
+. ./
+test_expect_success "pass --help to unknown command" "
+ cat <<-EOF >expected &&
+ git: '123' is not a git command. See 'git --help'.
+ (git 123 --help 2>actual || true) &&
+ test_i18ncmp expected actual

To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to
More majordomo info at

To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to
More majordomo info at

Reply via email to