Macos git子模块和分离头

Macos git子模块和分离头,macos,git,git-submodules,Macos,Git,Git Submodules,所以,我已经学习了更多关于git子模块的知识,我读到的每一个地方都告诉我,在我添加子模块之后,我最终得到了一个分离的头部。这是有道理的,因为我想让我的超级项目明确知道应该使用哪个提交。然而,这并不是我在实践中看到的(在MacOSX上) 考虑以下命令序列,这些命令创建一个包含单个文件的快速repo(称为sub),然后将其作为子模块添加到另一个称为blah的repo中 /tmp> git version git version 1.7.12.4 (Apple Git-37) /tmp>

所以,我已经学习了更多关于git子模块的知识,我读到的每一个地方都告诉我,在我添加子模块之后,我最终得到了一个分离的头部。这是有道理的,因为我想让我的超级项目明确知道应该使用哪个提交。然而,这并不是我在实践中看到的(在MacOSX上)

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

/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引用的是正确的提交散列,但不知何故位于主分支上,而不是分离的头

/tmp/blah/sub>cd.././sub
/tmp/sub>git reflog
97b97b3头@{0}:提交(初始):添加文件
/tmp/sub>cd../blah
/tmp/blah>git子模块状态
97b97b349cfae8da490c2cad3b3f4fc3af6a53c7分接头(主管/主管)
我错过了什么?非常感谢。

运行此命令:

git submodule add /tmp/sub sub
导致正常的
克隆
操作,因此您最终位于主分支的
头部
。但是,如果检查结果提交,您将看到
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
您会发现
sub
现在不在分支上,因为这不是正常的克隆操作,而是检出了显式提交。

运行此命令:

git submodule add /tmp/sub sub
导致正常的
克隆
操作,因此您最终位于主分支的
头部
。但是,如果检查结果提交,您将看到
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

您会发现
sub
现在不在分支上,因为它不是正常的克隆操作,而是检出显式提交。

Aha。。。我现在明白了。我没有意识到原始的
git子模块add
会让我的本地存储库处于与随后克隆时不同的状态。我用克隆我的repo的方法做了更多的测试,现在我可以看到,这是检查分离头部的子模块的行为(这是有意义的)。啊哈。。。我现在明白了。我没有意识到原始的
git子模块add
会让我的本地存储库处于与随后克隆时不同的状态。我用克隆我的repo的方法做了更多的测试,现在我可以看到,检查分离头部的子模块的行为(这是有意义的)。