Skip to content

Commit 4539c21

Browse files
peffgitster
authored andcommitted
remote: avoid reading $GIT_DIR config in non-repo
The "git ls-remote" command can be run outside of a repository, but needs to look up configured remotes. The config code is smart enough to handle this case itself, but we also check the historical "branches" and "remotes" paths in $GIT_DIR. The git_path() function causes us to blindly look at ".git/remotes", even if we know we aren't in a git repository. For now, this is just an unlikely bug (you probably don't have such a file if you're not in a repository), but it will become more obvious once we merge b1ef400 (setup_git_env: avoid blind fall-back to ".git", 2016-10-20): [now] $ git ls-remote fatal: No remote configured to list refs from. [with b1ef400] $ git ls-remote fatal: BUG: setup_git_env called without repository We can fix this by skipping these sources entirely when we're outside of a repository. The test is a little more complex than the demonstration above. Rather than detect the correct behavior by parsing the error message, we can actually set up a case where the remote name we give is a valid repository, but b1ef400 would cause us to die in the configuration step. This test doesn't fail now, but it future-proofs us for the b1ef400 change. Signed-off-by: Jeff King <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 3b9e3c2 commit 4539c21

File tree

2 files changed

+10
-1
lines changed

2 files changed

+10
-1
lines changed

remote.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -689,7 +689,7 @@ static struct remote *remote_get_1(const char *name,
689689
name = get_default(current_branch, &name_given);
690690

691691
ret = make_remote(name, 0);
692-
if (valid_remote_nick(name)) {
692+
if (valid_remote_nick(name) && have_git_dir()) {
693693
if (!valid_remote(ret))
694694
read_remotes_file(ret);
695695
if (!valid_remote(ret))

t/t5512-ls-remote.sh

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,4 +248,13 @@ test_expect_success PIPE,JGIT,GIT_DAEMON 'indicate no refs in standards-complian
248248
test_expect_code 2 git ls-remote --exit-code git://localhost:$JGIT_DAEMON_PORT/empty.git
249249
'
250250

251+
test_expect_success 'ls-remote works outside repository' '
252+
# It is important for this repo to be inside the nongit
253+
# area, as we want a repo name that does not include
254+
# slashes (because those inhibit some of our configuration
255+
# lookups).
256+
nongit git init --bare dst.git &&
257+
nongit git ls-remote dst.git
258+
'
259+
251260
test_done

0 commit comments

Comments
 (0)