2011-08-10 33 views
7

我已经使用git相当多,但远离子模块,因为我没有一个很好的理由使用它们。不过,最近我开始了一个明显需要使用git这个特性的项目。Git更新子模块与一个unamed分支

但是,每次我克隆整个项目时,子模块都会在没有名称的分支中结束。下面是我执行命令:

git clone <url to project> 
git submodule update --init <submodule> 
cd <submodule>; git branch 

,并打印出:

* (no branch) 
    master 

我需要做额外的

git checkout master 

现在我的问题是:这是标准的行为吗?如果没有,你能帮我理解我做错了什么吗?

感谢

回答

5

不像一些其他的SCM,犯的Git本来不属于任何特定的分支。分支头像一个提交书签。当您检出分支时(即文件.git/HEAD包含对分支的引用),并且您进行提交时,Git将该书签向前移动以指向新提交。

但是这种跟踪行为在这里不适用。正如你可能已经知道的,一个子模块固定在一个特定的提交上;它不追踪分支头。当你更新一个子模块时,Git检查出只有特定的提交。这意味着.git/HEAD包含提交散列,而不是分支引用。

可能有一个或多个分支头指向此提交,但这是无关紧要的。只有当HEAD包含分支引用,而不是提交散列时,git branch才会显示您处于分支上。

+0

谢谢!其实我并不知道子模块被固定到一个特定的提交,现在你已经解释了它,这是非常合理的。 – Fred

+0

有没有办法让这个'git checkout master'自动发生?它让我有几个小时的沮丧,并且我没有看到没有理由不让它在默认情况下结帐。 –

+0

我也对这个'git'行为感到沮丧!我们如何从一开始就不使用'git checkout '? –