我有一个远程裸存储库,有两个分支“master”和“testing”,其中 HEAD 指“testing”。
克隆此存储库时,git 检查“master”,如果“master”和“testing”位于同一修订版上(即 HEAD == test == master)。
仅当“测试”是后面或前面的一个(或多个)提交时,git clone 才会检查本地端的“测试”分支。
我在 Mac OS X (10.6.8) 上使用 git 1.7.5 尝试过此操作。
附录:
我刚刚对非裸存储库进行了相同的尝试:
mkdir A
cd A
git init
touch a
git add a
git commit -m "init repo A with a"
git checkout -b testing
现在回到根目录:
cd ..
git clone A B
cd B
git branch -v -a
* master 28f599b init A
remotes/origin/HEAD -> origin/master
remotes/origin/master 28f599b init A
remotes/origin/testing 28f599b init A
是‘师父’!回到仓库 A(我们仍处于分支“测试”中):
cd ../A
touch b
git add b
git commit -m "add b in branch testing"
现在“测试”是“大师”之前的一项提交。现在让我们再次克隆 A:
cd ..
git clone A C
cd C
git branch -a -v
* testing 23bca39 add b in branch testing
remotes/origin/HEAD -> origin/testing
remotes/origin/master 28f599b init A
remotes/origin/testing 23bca39 add b in branch testing
您可以通过返回 A、签出“master”并将其与“testing”合并来重新验证这种奇怪的行为(以便所有分支具有相同的头)。现在将 A 克隆到 D 中,并且 D 将在 master 上检查!
git clone
复制所有分支及其历史记录,以及 SHA1 和not他们的头的裁判。 AFAIK refspecs 不会被传输,因为它们对 git 来说比克隆更新(显然),并且克隆协议不保留它们......这意味着它猜测(编辑:这已被邮件列表确认)。
head 的 ref 在克隆过程中通过匹配其 SHA1 来猜测。在你的情况下,SHA1 是不明确的,因为master
and testing
两者匹配,所以master
按惯例选择。据我所知,这没有任何记录,但应该有。
要查看情况是否如此,请转到您的B
示例存储库并运行git ls-remote
。输出将为您提供 SHA1,而不是引用:
1c3eebcd1bd3659a40f02880918d5fbd5614b51a HEAD
1c3eebcd1bd3659a40f02880918d5fbd5614b51a refs/heads/master
1c3eebcd1bd3659a40f02880918d5fbd5614b51a refs/heads/testing
作为解决方法,
git clone -b <branch_name>
将克隆并签出您所需的分支branch_name,例如master或test。
我认为此时您被迫遵守 HEAD 是 master 的约定,master 是签出的默认分支,如果您设置为开发人员克隆不同的 head,请使用 -b 开关。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)