49

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

我现在有一个案例,这不是真的。我的理解显然是有缺陷的,那么在克隆(裸)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:
  ...

裸仓库使用 Git 版本 1.8.2.1,客户端使用 1.7.12.4,传输是 SSH。

也许答案其实就是这里的这个。这个答案证实了这一点。如果有一个符号引用都指向与 HEAD 相同的修订版,客户端将猜测使用哪个分支。

4

5 回答 5

34

Git 1.8.5HEAD开始,服务器将在“symref”功能中发送指向的实际分支名称。如果您的客户端和服务器都比 Git 1.8.5 更新,它将HEAD 正确更新。

在此之前,客户端将通过将 HEAD(最终)指向的对象 ID 与所有分支的所有对象 ID 进行比较来猜测 HEAD 可能指向的内容。它更喜欢一个名为refs/heads/master: 如果两者都HEAD指向master同一个对象 ID 的分支,则 clone 会将新存储库中的默认分支设置为master.

否则,具有匹配 OID 的第一个分支(当分支按字母数字排序时)将是默认分支。如果没有分支具有匹配的 OID,则将HEAD直接设置为对象 ID(即,分离的 HEAD)。

于 2015-09-10T13:46:20.367 回答
17

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

于 2013-09-10T18:11:55.780 回答
7

一个裸仓库也有一个HEAD. 这就是你克隆它时得到的。

git clone文档中:

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

关于“当前活动分支”的部分是指遥控器的HEAD修订版。

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

--branch <name>
-b <name>
不要将新创建的指向HEAD克隆存储库指向的分支HEAD,而是指向<name>分支。在非裸存储库中,这是将被检出的分支。--branch还可以在结果存储库中获取标签并分离该HEAD提交。

于 2013-09-10T18:11:30.093 回答
3

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

cat .git/refs/remotes/origin/HEAD | awk '{ print $2 }'
于 2019-09-14T14:42:56.300 回答
2

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

git switch $(cat $(git rev-parse --git-dir)/refs/remotes/origin/HEAD | cut -d'/' -f4)
于 2021-02-25T09:54:52.617 回答