git子模块检出同一个提交

时间:2015-05-20 07:52:32

标签: git git-submodules

git submodule update之后,它总是检出同一个提交。例如34561

我为子模块执行git checkout master,然后git submodule sync。然后它指向最新的提交a2344

但在update之后,它再次指向提交34561

如何改变?我的意思是为什么它决定指向那个提交而不是另一个?

4 个答案:

答案 0 :(得分:2)

  

我的意思是为什么它决定指向那个提交而不是另一个?

因为子模块总是在父仓库中将固定的SHA1提交记录为 gitlink special entry in the index )。
这就是为什么子模块总是恢复为detached HEAD branch

的原因

您可以配置子模块以跟随分支

cd /path/to/your/parent/repo
git config -f .gitmodules submodule.<path>.branch <branch>

子模块仍将恢复为固定提交,但可以使用以下命令进行更新:

git submodule update --remote

确保在父仓库中添加并提交新的gitlink (因为将子模块更新到最新的分支会更改其SHA1,在父仓库中记录为gitlink)。登记/> 如果你不这样做,你会发现你的子模块在接下来的git submodule update --init处恢复到以前的状态。

请参阅&#34; Git submodules: Specify a branch/tag&#34;。

答案 1 :(得分:1)

&#39;主要&#39; project包含对每个子模块的签出版本的SHA-1的引用。这是主项目中提交的一部分。

如果在子模块中手动更改子模块的头部,则需要告诉主项目从现在起它应该将此SHA-1用于子模块。

git commit -a

将执行此操作,因为主项目将看到子模块头已更新。

这可能会令人惊讶,但它实际上是一个很好的功能。通过检查主项目中的头部,您基本上可以告诉您的同事现在可以使用更新版本的子模块。这使得人们可以一起工作,而不会有太大的风险将地毯拉到别人的脚下。

(话虽如此,在带有子模块的工作流程中有很多瑕疵,你可能应该同意一种方法,并将其与一些团队脚本相结合以避免陷阱)。

答案 2 :(得分:0)

您需要进入子模块文件夹并执行:

git fetch --all --prune
git pull origin master

现在你将获得submodole中的最新提交 运行fetch后,它会更新子模块下的.git文件夹,并带有最新的提交。它将确保您有最近的更改。

答案 3 :(得分:0)

您可以执行:

format="flash"

这将更新所有子模块。