Ian Wienand <iwienand@xxxxxxxxxx> writes: > +test_expect_success 'tracing a shell alias with arguments shows trace of prepared command' ' > + git config alias.echo "!echo \$*" && > + env GIT_TRACE=1 git echo argument 2>output && > + test_grep "^trace: prepare_cmd:.*" output > +' If you run $ cd t && sh ./t0014-alias.sh -d && cat trash*.t0014-alias/output you'll see two "prepare_cmd" logged, because you added one to prepare_shell_cmd() and another to prepare_cmd(). If you were tracing something that uses prepare_git_cmd() on Windows, you would not see any trace output, on the other hand, I would suspect (I do not do Windows so this is from code inspection only). Perhaps squashing something like this is sufficient? run-command.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git c/run-command.c w/run-command.c index 13e35fb76e..7eb68a541d 100644 --- c/run-command.c +++ w/run-command.c @@ -296,7 +296,6 @@ static const char **prepare_shell_cmd(struct strvec *out, const char **argv) } strvec_pushv(out, argv); - trace_argv_printf(&out->v[1], "trace: prepare_cmd:"); return out->v; } @@ -436,7 +435,6 @@ static int prepare_cmd(struct strvec *out, const struct child_process *cmd) } } - trace_argv_printf(&out->v[1], "trace: prepare_cmd:"); return 0; } @@ -747,6 +745,7 @@ int start_command(struct child_process *cmd) error_errno("cannot run %s", cmd->args.v[0]); goto end_of_spawn; } + trace_argv_printf(&argv.v[1], "trace: prepare_cmd:"); if (pipe(notify_pipe)) notify_pipe[0] = notify_pipe[1] = -1; @@ -914,6 +913,7 @@ int start_command(struct child_process *cmd) cmd->args.v = prepare_git_cmd(&nargv, sargv); else if (cmd->use_shell) cmd->args.v = prepare_shell_cmd(&nargv, sargv); + trace_argv_printf(&cmd->args.v[1], "trace: prepare_cmd:"); cmd->pid = mingw_spawnvpe(cmd->args.v[0], cmd->args.v, (char**) cmd->env.v,