是什么决定了“git clone”之后的默认分支?

时间:2013-09-10 18:10:15

标签: git git-clone

我的理解是克隆存储库的默认分支是HEAD指向克隆的repo中的任何内容。

我现在遇到的情况并非如此。我的理解显然有缺陷,那么在克隆(裸)repo时,什么决定了默认的checkout分支呢?

该回购的最后一次提交是在裸仓库的HEAD中引用的分支与我在克隆中作为结账分支获得的分支之间的合并。

运行git remote show origin会返回:

Fetch URL: ...
Push  URL: ...
HEAD branch (remote HEAD is ambiguous, may be one of the following):
  <bad-branch>
  live
Remote branches:
  ...

Bare repo使用Git版本1.8.2.1,客户端使用1.7.12.4,传输使用SSH。

也许答案实际上是this one hereThis answer证实了这一点。如果可以选择符号引用全部指向与HEAD相同的修订,则客户端将猜测使用哪个分支。

4 个答案:

答案 0 :(得分:12)

这实际上是HEAD指出的。使用git symbolic-ref HEAD refs/heads/mybranch设置HEAD。 (来源:http://feeding.cloud.geek.nz/posts/setting-default-git-branch-in-bare/

答案 1 :(得分:7)

裸仓库也有HEAD。这就是你克隆它时得到的结果。

来自git clone documentation

  

将存储库克隆到新创建的目录中,为克隆存储库中的每个分支创建远程跟踪分支(使用git branch -r可见),并创建并检出从克隆存储库当前分叉的初始分支活跃的分支。

关于“当前活动分支”的位是指远程的HEAD修订版。

如果您想要不同的行为,可以使用--branch-b

  

<强> --branch <name>
  的 -b <name>
  而不是将新创建的HEAD指向克隆的存储库HEAD所指向的分支,而是指向<name>分支。在非裸存储库中,这是将要检出的分支。 --branch还可以在生成的存储库中对该提交中的HEAD进行标记和分离。

答案 2 :(得分:2)

如果想手动检查 origin 远程的默认分支,这应该可以可靠地工作:

git switch $(cat $(git rev-parse --git-dir)/refs/remotes/origin/HEAD | cut -d'/' -f4)

答案 3 :(得分:0)

它是origin/HEAD。但是,如果要使用“ origin / master”之类的名称,则必须像这样解析文件

cat .git/refs/remotes/origin/HEAD | awk '{ print $2 }'