Recent git versions (2.39.0 through 2.41.0) Git.pm seems to forget its
Directory argument for bare repos. Initial creation of a
Git->repository object will succeed, but subsequent $repo->command()
fails unless the repo is in pwd or is set in the GIT_DIR environment
argument.
patsy@ultron ~/tmp/repo-test $ git init --bare test1.git
Initialized empty Git repository in /home/patsy/tmp/repo-test/test1.git/
# success with 2.38.4
patsy@ultron ~/tmp/repo-test $ git --version
git version 2.38.4
patsy@ultron ~/tmp/repo-test $ perl -MGit -e 'my $repo = Git->repository(Directory=>"/home/patsy/tmp/repo-test/test1.git/")||die "git open failed: $!\n"; $repo->command("rev-list", "--all", "-1"); print "rev-list succeeded\n"'
rev-list succeeded
# fail with 2.41.0
patsy@ultron ~/tmp/repo-test $ git --version
git version 2.41.0
patsy@ultron ~/tmp/repo-test $ perl -MGit -e 'my $repo =
Git->repository(Directory=>"/home/patsy/tmp/repo-test/test1.git/")||die "git open failed: $!\n"; $repo->command("rev-list", "--all", "-1"); print "rev-list succeeded\n"'
fatal: not a git repository: '/home/patsy/tmp/repo-test'
rev-list --all -1: command returned error: 128
# success with 2.41.0 after cd
patsy@ultron ~/tmp/repo-test $ cd test1.git/
patsy@ultron ~/tmp/repo-test/test1.git $ perl -MGit -e 'my $repo = Git->repository(Directory=>"/home/patsy/tmp/repo-test/test1.git/")||die "git open failed: $!\n"; $repo->command("rev-list", "--all", "-1"); print "rev-list succeeded\n"'
rev-list succeeded
# success with 2.41.0 with GIT_DIR= set
patsy@ultron ~/tmp/repo-test $
GIT_DIR=/home/patsy/tmp/repo-test/test1.git/ perl -MGit -e 'my $repo = Git->repository(Directory=>"/home/patsy/tmp/repo-test/test1.git/")||die "git open failed: $!\n"; $repo->command("rev-list", "--all", "-1"); print "rev-list succeeded\n"'
rev-list succeeded
It seems to be only bare repos that are a problem:
# success with 2.41.0 for a non-bare repo
patsy@ultron ~/tmp/repo-test $ git --version
git version 2.41.0
patsy@ultron ~/tmp/repo-test $ git init test2
Initialized empty Git repository in /home/patsy/tmp/repo-test/test2/.git/
patsy@ultron ~/tmp/repo-test $ perl -MGit -e 'my $repo = Git->repository(Directory=>"/home/patsy/tmp/repo-test/test2")||die "git open failed: $!\n"; $repo->command("rev-list", "--all", "-1"); print "rev-list succeeded\n"'
rev-list succeeded
When stracing both, I can see that Git.pm does an initial execve of
git rev-parse --is-bare-repository --git-dir, and it *does* cd prior to
that. But running the specified command is done in a new child which
does not chdir first. For non-bare repos, the child executing the
command does chdir.
Thanks,
--
Hank Leininger [off-list ref]
9606 3BF9 B593 4CBC E31A A384 6200 F6E3 781E 3DD7