threads / bug / 33156

A bug or unhandled case

Subject: A bug or unhandled case

## tl;dr

4 messages between Mar 11, 2013 and Mar 11, 2013.

replies: 3people: 2as markdown or json

Michał Janiszewski· Mar 11, 2013, 16:06 UTC · lore

Hi, I think I've found a bug in git or at least a use case that is not handled. In few words it can be described like this: if you push a remote branch to another remote, which is bare repository, you cannot remove that branch from said bare repository. Here is a recipe how to reproduce that with git 1.8.0: git init foo git init --bare bar.git git init --bare baz.git cd foo echo test > file git commit -am "initial commit" git remote add bar ../bar.git git remote add baz ../baz.git git push bar master cd .. git clone bar.git bax cd bax git checkout -b "test_branch" echo evil > file git commit -am "evil commit" git push origin test-branch cd ../foo git fetch bar git push baz bar/test_branch cd ../baz.git

### # on that point in baz.git there is only one branch: # remotes/bar/test_branch 8b96ffe evil commit # trying to remove that branch yields no results: $ git branch -D refs/remotes/bar/test_branch error: branch 'refs/remotes/bar/test_branch' not found. $ git branch -D remotes/bar/test_branch error: branch 'remotes/bar/test_branch' not found. $ git branch -D bar/test_branch error: branch 'bar/test_branch' not found. $ git branch -D test_branch error: branch 'test_branch' not found.

git gc --prune=now # also does nothing

The only way to remove that branch is to: cd ../foo git push baz :bar/test_branch

Shouldn't someone who owns bare repository be able to delete that kind of branches as he is able to do with "regular" branches?

-- Michal Janiszewski

Junio C Hamano· Mar 11, 2013, 16:29 UTC · re: Michał Janiszewski · lore

Re: A bug or unhandled case

Michał Janiszewski <janisozaur@gmail.com> writes:
Show 12 quoted lines
> Hi,
> I think I've found a bug in git or at least a use case that is not handled.
> In few words it can be described like this: if you push a remote
> branch to another remote, which is bare repository, you cannot remove
> that branch from said bare repository.
> Here is a recipe how to reproduce that with git 1.8.0:
> git init foo
> git init --bare bar.git
> git init --bare baz.git
> cd foo
> echo test > file
> git commit -am "initial commit"

Nothing added, nothing committed, at this point. I'd assume there is "git add file" before this commit.

Show 10 quoted lines
> git remote add bar ../bar.git
> git remote add baz ../baz.git
> git push bar master
> cd ..
> git clone bar.git bax
> cd bax
> git checkout -b "test_branch"
> echo evil > file
> git commit -am "evil commit"
> git push origin test-branch

error: src refspec test-branch does not match any. error: failed to push some refs to '...../bar.git'

I'd assume that is test_branch
Show 7 quoted lines
> cd ../foo
> git fetch bar
> git push baz bar/test_branch
> cd ../baz.git
>
> ###
> # on that point in baz.git there is only one branch:
Correct.
> # remotes/bar/test_branch 8b96ffe evil commit
> # trying to remove that branch yields no results:
> $ git branch -D refs/remotes/bar/test_branch

That is not the way to remove the remote tracking branch test_branch you have from remote bar, is it?

	git branch -r -D bar/test_branch
Michał Janiszewski· Mar 11, 2013, 16:39 UTC · re: Junio C Hamano · lore

Re: A bug or unhandled case

Hmm, indeed it works. Sorry for the confusion then (and a bit mistaken commands, but you got them correct). I wasn't aware of the -r option.

On Mon, Mar 11, 2013 at 5:29 PM, Junio C Hamano <gitster@pobox.com> wrote:
Show 53 quoted lines
> Michał Janiszewski <janisozaur@gmail.com> writes:
>
>> Hi,
>> I think I've found a bug in git or at least a use case that is not handled.
>> In few words it can be described like this: if you push a remote
>> branch to another remote, which is bare repository, you cannot remove
>> that branch from said bare repository.
>> Here is a recipe how to reproduce that with git 1.8.0:
>> git init foo
>> git init --bare bar.git
>> git init --bare baz.git
>> cd foo
>> echo test > file
>> git commit -am "initial commit"
>
> Nothing added, nothing committed, at this point.
> I'd assume there is "git add file" before this commit.
>
>> git remote add bar ../bar.git
>> git remote add baz ../baz.git
>> git push bar master
>> cd ..
>> git clone bar.git bax
>> cd bax
>> git checkout -b "test_branch"
>> echo evil > file
>> git commit -am "evil commit"
>> git push origin test-branch
>
> error: src refspec test-branch does not match any.
> error: failed to push some refs to '...../bar.git'
>
> I'd assume that is test_branch
>
>> cd ../foo
>> git fetch bar
>> git push baz bar/test_branch
>> cd ../baz.git
>>
>> ###
>> # on that point in baz.git there is only one branch:
>
> Correct.
>
>> # remotes/bar/test_branch 8b96ffe evil commit
>> # trying to remove that branch yields no results:
>> $ git branch -D refs/remotes/bar/test_branch
>
> That is not the way to remove the remote tracking branch test_branch
> you have from remote bar, is it?
>
>         git branch -r -D bar/test_branch
>

-- Michal Janiszewski

Junio C Hamano· Mar 11, 2013, 16:53 UTC · re: Michał Janiszewski · lore

Re: A bug or unhandled case

Michał Janiszewski <janisozaur@gmail.com> writes:
> Hmm, indeed it works. Sorry for the confusion then (and a bit mistaken
> commands, but you got them correct).
> I wasn't aware of the -r option.

I think what tripped you was that "git branch" deals with branch names, and not refnames (which is the underlying but lower level concept). "git branch -d refs/heads/master" is not a way to remove your local mastar branch.

← back to recent threads