Git clone behave strange after active branch change in bare repo

2 messages, 2 authors, 2016-06-15 · open the first message on its own page

Git clone behave strange after active branch change in bare repo

From: Zdenek Crha <hidden>
Date: 2016-06-15 22:53:16

Hello,

I'm trying to change active branch on bare repository to force
checkout of different branch than master when directory is cloned. The
git version I'm using is  1.7.9.1 from debian repository.

I've used git-symbolic-ref to change active branch without problem:

$ cd repository.git
$ git branch
* master
$ git branch a_branch
$ git symbolic-ref HEAD refs/heads/a_branch
$ cat HEAD
ref: refs/heads/a_branch

When I run git clone while 'master' and 'a_branch' point to same
commit, I will get clone with default branch 'master' where I would
expect default branch 'a_branch'.

$ cd .. && git clone repository.git repo
$ cd repo && git branch
* master

I've tried to remove master branch and I've got result I've expected -
new clone has one branch checked out, the 'a_branch'.
But then I created another branch on the commit pointed by active
branch and tried to clone:

$ cd repository.git && git branch AAA
$ cd .. && git clone repository.git
$ cd repo && git branch
* AAA

I did few more checks and it seems to me that:

* when active branch is 'master' then default branch in clone is
always master as expected
* when active branch is different from 'master', then the default
branch in clone is a first branch in alfabetically sorted list of
branches that point to same commit as active branch

Is this behaviour correct or did I run into a bug?

Regards,
Zdenek Crha

Re: Git clone behave strange after active branch change in bare repo

From: Jeff King <hidden>
Date: 2016-06-15 22:53:16

On Mon, Mar 12, 2012 at 11:10:03AM +0100, Zdenek Crha wrote:
When I run git clone while 'master' and 'a_branch' point to same
commit, I will get clone with default branch 'master' where I would
expect default branch 'a_branch'.
Yes, this is a known issue. The git protocol does not transfer the
contents of the symref; the client must guess the branch name from the
set of refs that are advertised. This has been discussed before, and
there were even some patches proposed, but I think nobody cared enough
to push it through, as it requires an extension to the protocol.

You can search the list archives for past discussions.
I did few more checks and it seems to me that:

* when active branch is 'master' then default branch in clone is
always master as expected
* when active branch is different from 'master', then the default
branch in clone is a first branch in alfabetically sorted list of
branches that point to same commit as active branch
Exactly. The relevant code is in remote.c:guess_remote_head.

-Peff
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help