# with git-next, git pull --rebase can print out "fatal: No such ref: ''" for branches without an upstream

9 messages from 2014-01-17 to 2014-01-17. Participants: Siddharth Agarwal, Jeff King, John Keeping, Junio C Hamano.
Thread: https://gitlist.dev/t/35677

## Siddharth Agarwal, 2014-01-17 01:08

Subject: with git-next, git pull --rebase can print out "fatal: No such ref: ''" for branches without an upstream
Message-ID: <52D8827E.3060007@fb.com>
URL: https://gitlist.dev/e/52D8827E.3060007%40fb.com

```
With git-next, where git pull --rebase can print out "fatal: No such 
ref: ''" if git pull --rebase is run on branches without an upstream.

With git at b139ac2589b15d55cd9fa5c6957da44b150d0737, the following 
commands demonstrate the problem:

git init repo1
cd repo1
touch a; git add a; git commit -m "a"
cd ..
git clone repo1 repo2
cd repo2
git config remote.origin.fetch refs/heads/master:refs/remotes/origin/master
git checkout -b test
git pull --rebase

This results in the following output:

fatal: No such ref: ''
Current branch test is up to date.

So the pull --rebase looks like it works, but it prints out a spurious 
fatal error.

I've managed to bisect this down to 
https://github.com/gitster/git/commit/48059e405028ebf8a09c5a9aede89dfb460cce98. 
Looks like get_remote_merge_branch is called without arguments, and it 
returns an empty string. This string is passed as-is to git merge-base, 
which causes the error.

```

## Jeff King, 2014-01-17 02:21

Subject: Re: with git-next, git pull --rebase can print out "fatal: No such ref: ''" for branches without an upstream
Message-ID: <20140117022152.GB12444@sigill.intra.peff.net>
URL: https://gitlist.dev/e/20140117022152.GB12444%40sigill.intra.peff.net
In-Reply-To: <52D8827E.3060007@fb.com>

```
On Thu, Jan 16, 2014 at 05:08:14PM -0800, Siddharth Agarwal wrote:

> With git-next, where git pull --rebase can print out "fatal: No such
> ref: ''" if git pull --rebase is run on branches without an upstream.

This is already fixed in bb3f458 (rebase: fix fork-point with zero
arguments, 2014-01-09), I think.

-Peff

```

## Siddharth Agarwal, 2014-01-17 02:47

Subject: Re: with git-next, git pull --rebase can print out "fatal: No such ref: ''" for branches without an upstream
Message-ID: <52D899CA.5050409@fb.com>
URL: https://gitlist.dev/e/52D899CA.5050409%40fb.com
In-Reply-To: <20140117022152.GB12444@sigill.intra.peff.net>

```
On 01/16/2014 06:21 PM, Jeff King wrote:
> On Thu, Jan 16, 2014 at 05:08:14PM -0800, Siddharth Agarwal wrote:
>
>> With git-next, where git pull --rebase can print out "fatal: No such
>> ref: ''" if git pull --rebase is run on branches without an upstream.
> This is already fixed in bb3f458 (rebase: fix fork-point with zero
> arguments, 2014-01-09), I think.

If I'm reading the patch correctly, that only fixes it for git rebase, 
not for git pull --rebase. git-pull.sh contains a separate invocation of 
git merge-base --fork-point.

```

## John Keeping, 2014-01-17 08:40

Subject: Re: with git-next, git pull --rebase can print out "fatal: No such ref: ''" for branches without an upstream
Message-ID: <20140117084010.GL7608@serenity.lan>
URL: https://gitlist.dev/e/20140117084010.GL7608%40serenity.lan
In-Reply-To: <52D899CA.5050409@fb.com>

```
On Thu, Jan 16, 2014 at 06:47:38PM -0800, Siddharth Agarwal wrote:
> On 01/16/2014 06:21 PM, Jeff King wrote:
> > On Thu, Jan 16, 2014 at 05:08:14PM -0800, Siddharth Agarwal wrote:
> >
> >> With git-next, where git pull --rebase can print out "fatal: No such
> >> ref: ''" if git pull --rebase is run on branches without an upstream.
> > This is already fixed in bb3f458 (rebase: fix fork-point with zero
> > arguments, 2014-01-09), I think.
> 
> If I'm reading the patch correctly, that only fixes it for git rebase, 
> not for git pull --rebase. git-pull.sh contains a separate invocation of 
> git merge-base --fork-point.

I'm pretty sure the invocation in git-pull.sh is OK.  The error then
comes out of git-rebase.sh when git-pull invokes it.

Are you running a version of git-next that includes bb3f458?

```

## Siddharth Agarwal, 2014-01-17 18:09

Subject: Re: with git-next, git pull --rebase can print out "fatal: No such ref: ''" for branches without an upstream
Message-ID: <52D971E3.8090406@fb.com>
URL: https://gitlist.dev/e/52D971E3.8090406%40fb.com
In-Reply-To: <20140117084010.GL7608@serenity.lan>

```
On 01/17/2014 12:40 AM, John Keeping wrote:
> On Thu, Jan 16, 2014 at 06:47:38PM -0800, Siddharth Agarwal wrote:
>> On 01/16/2014 06:21 PM, Jeff King wrote:
>>> On Thu, Jan 16, 2014 at 05:08:14PM -0800, Siddharth Agarwal wrote:
>>>
>>>> With git-next, where git pull --rebase can print out "fatal: No such
>>>> ref: ''" if git pull --rebase is run on branches without an upstream.
>>> This is already fixed in bb3f458 (rebase: fix fork-point with zero
>>> arguments, 2014-01-09), I think.
>> If I'm reading the patch correctly, that only fixes it for git rebase,
>> not for git pull --rebase. git-pull.sh contains a separate invocation of
>> git merge-base --fork-point.
> I'm pretty sure the invocation in git-pull.sh is OK.  The error then
> comes out of git-rebase.sh when git-pull invokes it.

That doesn't square with 48059e4 being the culprit commit.

> Are you running a version of git-next that includes bb3f458?

Yes, I am.

```

## Junio C Hamano, 2014-01-17 18:57

Subject: Re: with git-next, git pull --rebase can print out "fatal: No such ref: ''" for branches without an upstream
Message-ID: <xmqq8uuexwp7.fsf@gitster.dls.corp.google.com>
URL: https://gitlist.dev/e/xmqq8uuexwp7.fsf%40gitster.dls.corp.google.com
In-Reply-To: <20140117022152.GB12444@sigill.intra.peff.net>

```
Jeff King <peff@peff.net> writes:

> On Thu, Jan 16, 2014 at 05:08:14PM -0800, Siddharth Agarwal wrote:
>
>> With git-next, where git pull --rebase can print out "fatal: No such
>> ref: ''" if git pull --rebase is run on branches without an upstream.
>
> This is already fixed in bb3f458 (rebase: fix fork-point with zero
> arguments, 2014-01-09), I think.

Doesn't the call to get_remote_merge_branch in this part

        test -n "$curr_branch" &&
        . git-parse-remote &&
        remoteref="$(get_remote_merge_branch "$@" 2>/dev/null)" &&
        oldremoteref=$(git merge-base --fork-point "$remoteref" $curr_branch)

yield an empty string, feeding it to "merge-base --fork-point" as
its first parameter?

Perhaps something like this is needed?

 git-pull.sh | 1 +
 1 file changed, 1 insertion(+)

diff --git a/git-pull.sh b/git-pull.sh
index 605e957..467c66c 100755
--- a/git-pull.sh
+++ b/git-pull.sh
@@ -229,6 +229,7 @@ test true = "$rebase" && {
 	test -n "$curr_branch" &&
 	. git-parse-remote &&
 	remoteref="$(get_remote_merge_branch "$@" 2>/dev/null)" &&
+	test -n "$remoteref" &&
 	oldremoteref=$(git merge-base --fork-point "$remoteref" $curr_branch)
 }
 orig_head=$(git rev-parse -q --verify HEAD)

```

## John Keeping, 2014-01-17 19:26

Subject: Re: with git-next, git pull --rebase can print out "fatal: No such ref: ''" for branches without an upstream
Message-ID: <20140117192619.GP7608@serenity.lan>
URL: https://gitlist.dev/e/20140117192619.GP7608%40serenity.lan
In-Reply-To: <xmqq8uuexwp7.fsf@gitster.dls.corp.google.com>

```
On Fri, Jan 17, 2014 at 10:57:56AM -0800, Junio C Hamano wrote:
> Jeff King <peff@peff.net> writes:
> 
> > On Thu, Jan 16, 2014 at 05:08:14PM -0800, Siddharth Agarwal wrote:
> >
> >> With git-next, where git pull --rebase can print out "fatal: No such
> >> ref: ''" if git pull --rebase is run on branches without an upstream.
> >
> > This is already fixed in bb3f458 (rebase: fix fork-point with zero
> > arguments, 2014-01-09), I think.
> 
> Doesn't the call to get_remote_merge_branch in this part
> 
>         test -n "$curr_branch" &&
>         . git-parse-remote &&
>         remoteref="$(get_remote_merge_branch "$@" 2>/dev/null)" &&
>         oldremoteref=$(git merge-base --fork-point "$remoteref" $curr_branch)
> 
> yield an empty string, feeding it to "merge-base --fork-point" as
> its first parameter?

For some reason I assumed that get_remote_merge_branch would either
yield a non-empty string or return failure, meaning that the &&-chain
makes everything OK.

Before the change to use "merge-base --fork-point", the code was:

	oldremoteref="$(git rev-parse -q --verify "$remoteref")" &&
	for reflog in $(git rev-list -g $remoteref 2>/dev/null)
	do
		if test "$reflog" = "$(git merge-base $reflog $curr_branch)"
		then
			oldremoteref="$reflog"
			break
		fi
	done

which has a similar failure - rev-list requires a revision argument and
prints its usage if not given one.

> Perhaps something like this is needed?
> 
>  git-pull.sh | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/git-pull.sh b/git-pull.sh
> index 605e957..467c66c 100755
> --- a/git-pull.sh
> +++ b/git-pull.sh
> @@ -229,6 +229,7 @@ test true = "$rebase" && {
>  	test -n "$curr_branch" &&
>  	. git-parse-remote &&
>  	remoteref="$(get_remote_merge_branch "$@" 2>/dev/null)" &&
> +	test -n "$remoteref" &&
>  	oldremoteref=$(git merge-base --fork-point "$remoteref" $curr_branch)
>  }
>  orig_head=$(git rev-parse -q --verify HEAD)

Either that or "2>/dev/null" like in the original, yes.

```

## John Keeping, 2014-01-17 20:00

Subject: [PATCH] pull: suppress error when no remoteref is found
Message-ID: <509ac5f3245546def79575174c52de2d0416fe24.1389988820.git.john@keeping.me.uk>
URL: https://gitlist.dev/e/509ac5f3245546def79575174c52de2d0416fe24.1389988820.git.john%40keeping.me.uk
In-Reply-To: <20140117192619.GP7608@serenity.lan>

```
Commit 48059e4 (pull: use merge-base --fork-point when appropriate,
2013-12-08) incorrectly assumes that get_remote_merge_branch will either
yield a non-empty string or return an error, but there are circumstances
where it will yield an empty string.

The previous code then invoked git-rev-list with no arguments, which
results in an error suppressed by redirecting stderr to /dev/null.  Now
we invoke git-merge-base with an empty branch name, which also results
in an error.  Suppress this in the same way.

Signed-off-by: John Keeping <john@keeping.me.uk>
---
 git-pull.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/git-pull.sh b/git-pull.sh
index f210d0a..0a5aa2c 100755
--- a/git-pull.sh
+++ b/git-pull.sh
@@ -229,7 +229,7 @@ test true = "$rebase" && {
 	test -n "$curr_branch" &&
 	. git-parse-remote &&
 	remoteref="$(get_remote_merge_branch "$@" 2>/dev/null)" &&
-	oldremoteref=$(git merge-base --fork-point "$remoteref" $curr_branch)
+	oldremoteref=$(git merge-base --fork-point "$remoteref" $curr_branch 2>/dev/null)
 }
 orig_head=$(git rev-parse -q --verify HEAD)
 git fetch $verbosity $progress $dry_run $recurse_submodules --update-head-ok "$@" || exit 1
-- 
1.8.5.226.g0d60d77

```

## Junio C Hamano, 2014-01-17 20:02

Subject: Re: with git-next, git pull --rebase can print out "fatal: No such ref: ''" for branches without an upstream
Message-ID: <xmqqeh46wf53.fsf@gitster.dls.corp.google.com>
URL: https://gitlist.dev/e/xmqqeh46wf53.fsf%40gitster.dls.corp.google.com
In-Reply-To: <20140117192619.GP7608@serenity.lan>

```
John Keeping <john@keeping.me.uk> writes:

>> Perhaps something like this is needed?
>>  ...
> Either that or "2>/dev/null" like in the original, yes.

Ah, that makes sense.  I see you already followed-up with a patch,
so I'll pick it up.

Thanks.

```
