2013-03-13 85 views
0

所以,我一直在学习更多关于git子模块的知识,而且我读过的每个地方都告诉我,在添加子模块之后,我会得到一个分离的HEAD。这是有道理的,因为我希望我的超级项目明确知道应该使用哪个提交。但是,这不是我在实践中看到的(在Mac OS X上)。git submodules and detached HEAD

请考虑以下一系列命令,它们创建一个包含单个文件的快速回购(称为“子”),然后将其作为子模块添加到另一个称为“等值”的回购。

/tmp> git version 
git version 1.7.12.4 (Apple Git-37) 
/tmp> git init sub 
Initialized empty Git repository in /private/tmp/sub/.git/ 
/tmp> cd sub 
/tmp/sub> touch a.txt 
/tmp/sub> git add a.txt 
/tmp/sub> git commit -m "add a file" 
[master (root-commit) c527790] . 
0 files changed 
create mode 100644 a.txt 
/tmp/sub> cd .. 
/tmp> git init blah 
Initialized empty Git repository in /private/tmp/blah/.git/ 
/tmp> cd blah 
/tmp/blah> git submodule add /tmp/sub sub 
Cloning into 'sub'... 
done. 
/tmp/blah> cd sub 
/tmp/blah/sub> git status 
# On branch master 
nothing to commit (working directory clean) 

为什么主分支上的子模块?我希望它能说它不在分支上。多一点挖掘表明,git引用了正确的提交散列,但以某种方式在主分支上,而不是分离的HEAD。

/tmp/blah/sub> cd ../../sub 
/tmp/sub> git reflog 
97b97b3 [email protected]{0}: commit (initial): add a file 
/tmp/sub> cd ../blah 
/tmp/blah> git submodule status 
97b97b349cfae8da490c2cad3b3f4fc3af6a53c7 sub (heads/master) 

我错过了什么?非常感谢。

回答

3

运行此命令:

git submodule add /tmp/sub sub 

结果在正常clone操作,所以你最终在主分支的HEAD。但是,如果您检查生成的提交,您会看到git会在存储库中记录显式提交哈希。

从你blah仓库里:

$ git commit -m 'added submodule' 
[master (root-commit) 13e36eb] added submodule 
2 files changed, 4 insertions(+) 
create mode 100644 .gitmodules 
create mode 160000 sub 
$ git log --oneline 
13e36eb added submodule 
$ git cat-file -p 13e36eb 
tree 5d205c2e2ce63d8087b3b6644e3ac183cd49c644 
author Lars <[email protected]> 1363184265 -0400 
committer Lars <[email protected]> 1363184265 -0400 

added submodule 
$ git cat-file -p 5d205c2e2ce63d8087b3b6644e3ac183cd49c644 
100644 blob 30c9a7559a85f36bcedaabb8bdfaf43363966b85 .gitmodules 
160000 commit 2122e5378b7940afae8e49ad9179c815c7711610 sub 

最后一行(160000 commit ...)显示提交的哈希git记录了你的子模块。

如果你现在是到克隆与子模块的库...

cd /tmp 
git clone --recursive blah cloned-blah 

你会发现,现在sub就是因为这个,而不是签出正常的克隆操作不是一个分公司,显式提交。

+0

啊哈...我现在看到了。我没有意识到最初的'git submodule add'离开我的本地仓库的状态不同于后来被克隆的状态。 我用我克隆我的回购的方式做了一些更多的测试,现在我可以看到它是**检查出分离HEAD的子模块(这是有道理的)。 – 2013-03-13 18:50:11