From: "Gustavo L. de M. Chaves" <>

Routine _cmd_exec invokes _setup_git_cmd_env inside the child process
before invoking an external git command to set up the environment
variables GIT_DIR and GIT_WORK_TREE and, also, to chdir to the
repository. But _cmd_exec is only used on Unix. On Windows, it's not
used and the main code path is in _command_common_pipe, which didn't
prepare the environment like _cmd_exec.

Without this environment preparation some git commands, such as "git
clone", don't work.

We can't use _setup_git_cmd_env in this case because we don't use a
forking open like _cmd_exec does and don't get a chance to make such
preparations on the child process.

So, the preparation is done on _command_common_pipe by setting up
localized environment variables and by chdir temporarily just before
invoking the external command.

Signed-off-by: Gustavo L. de M. Chaves <>
 perl/ | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/perl/ b/perl/
index 658b602..e14b41a 100644
--- a/perl/
+++ b/perl/
@@ -1302,6 +1302,19 @@ sub _command_common_pipe {
                #       warn 'ignoring STDERR option - running w/ ActiveState';
                $direction eq '-|' or
                        die 'input pipe for ActiveState not implemented';
+               # Set up repo environment
+               local $ENV{GIT_DIR}       = $self->repo_path() if defined $self 
&& $self->repo_path();
+               local $ENV{GIT_WORK_TREE} = $self->wc_path()   if defined $self 
&& $self->repo_path() && $self->wc_path();
+               my $cwd = cwd;
+               if (defined $self) {
+                       chdir $self->repo_path() if $self->repo_path();
+                       chdir $self->wc_path()   if $self->wc_path();
+                       chdir $self->wc_subdir() if $self->wc_subdir();
+               }
                # the strange construction with *ACPIPE is just to
                # explain the tie below that we want to bind to
                # a handle class, not scalar. It is not known if
@@ -1310,6 +1323,7 @@ sub _command_common_pipe {
                tie (*ACPIPE, 'Git::activestate_pipe', $cmd, @args);
                $fh = *ACPIPE;
+               chdir $cwd;
        } else {
                my $pid = open($fh, $direction);
                if (not defined $pid) {

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