0

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

考虑以下命令序列,这些命令创建一个包含单个文件的快速存储库(称为 sub),然后将其作为子模块添加到另一个名为 blah 的存储库中。

/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 HEAD@{0}: commit (initial): add a file
/tmp/sub> cd ../blah
/tmp/blah> git submodule status
 97b97b349cfae8da490c2cad3b3f4fc3af6a53c7 sub (heads/master)

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

4

1 回答 1

3

运行此命令:

git submodule add /tmp/sub sub

结果正常clone运行,因此您最终进入HEAD了 master 分支。但是,如果您检查生成的提交,您会看到它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 <lars@> 1363184265 -0400
committer Lars <lars@> 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现在不在分支上,因为它不是正常的克隆操作,而是检查显式提交。

于 2013-03-13T14:16:09.983 回答