When run_builtin() sees "-h" as the first argument, it assumes that: - it's the call for help usage - the real git command will only print help usage then exit So it skips all setup in this case. Unfortunately some commands may do more things before calling parse_options(), which is where help usage is printed. Some of those things may touch repository, which has yet to be set up. Until now, the only safe thing that can be called before parse_options() is git_config(). This function is aware of repository findind status, and will skip reading $GIT_DIR/config if no repository is found. Make real commands aware of this fast path so that they can handle it properly (i.e. print help usage then exist immediately) if they do more initialization than git_config(). Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx> --- cache.h | 1 + git.c | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/cache.h b/cache.h index 2980741..bdcd1ec 100644 --- a/cache.h +++ b/cache.h @@ -1067,6 +1067,7 @@ int checkout_fast_forward(const unsigned char *from, const unsigned char *to); struct startup_info { const char *prefix; int have_repository; + int help; }; extern struct startup_info *startup_info; diff --git a/git.c b/git.c index fac3d1c..d60f792 100644 --- a/git.c +++ b/git.c @@ -237,13 +237,13 @@ struct cmd_struct { static int run_builtin(struct cmd_struct *p, int argc, const char **argv) { - int status, help; + int status; struct stat st; memset(&git_startup_info, 0, sizeof(git_startup_info)); startup_info = &git_startup_info; - help = argc == 2 && !strcmp(argv[1], "-h"); - if (!help) { + startup_info->help = argc == 2 && !strcmp(argv[1], "-h"); + if (!startup_info->help) { if (p->option & RUN_SETUP) setup_git_directory(); if (p->option & RUN_SETUP_GENTLY) { @@ -261,7 +261,7 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv) } commit_pager_choice(); - if (!help && p->option & NEED_WORK_TREE) + if (!startup_info->help && p->option & NEED_WORK_TREE) setup_work_tree(); trace_argv_printf(argv, "trace: built-in: git"); -- 1.7.0.rc1.541.g2da82.dirty -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html