git submodule“--remote”导致(新提交)

时间:2016-04-20 19:54:42

标签: git git-submodules

如何防止git status在更新后显示锁定到特定子模块分支的子模块?

我使用特定分支添加了一个git子模块:

git submodule add -b feature/special git@.../buildenv.git env
git commit -a -m "added submodule locked to special feature"
git push

一切都很好,直到有人致力于子模块并推动 现在,当我更新子模块时,我看到来自状态

的新提交消息
git submodule update --remote --recursive --init
git diff

index b45bfd8..2334b1f 160000
--- a/env
+++ b/env
@@ -1 +1 @@
-Subproject commit b45bfd8f498a4d86a9586e1a4b1a6194052274b0
+Subproject commit 2334b1faa019c28c6fe75cef94fd94d847593c37

2 个答案:

答案 0 :(得分:0)

当你(1)指定-b feature/special然后(2)使用update --remote时,这就是你要求的。 (这两项都是此操作所必需的,虽然它是触发实际更新的update --remote部分,您可以在{{{{}}之前添加,删除或调整-b设置1}} - 但通常你不会,我认为你没有。)

因为我不使用子模块(对他们的替代名称过于熟悉,并且#34; sob-modules" :-)虽然他们最近肯定有所改进)但我真的不想提供建议在正确的方式"去做这个。但是,我可以解释潜在的机制以及所有这些相当复杂的Jenga-ish结构是如何产生的。

基本上,子模块只是一个简单的配对:

  • 我的超级项目X在存储库中。它提交了X1,X2,......,X11。
  • 要使用这些提交,您还需要一个单独的存储库Y ...

    • 我在提交X1,X2,X3等测试我的超级项目X,使用提交Y20的另一个存储库,所以你必须并且将获得提交Y20并且只提交Y20。
    • 哦等等,我刚刚使用提交Y47的另一个存储库在新提交X12上更新并重新测试了我的超级项目,所以你必须并且将获得提交Y47并且只提交Y47(对于我的提交X12;以及Y20用于所有我之前的承诺)。

换句话说,配对是超级项目中的提交ID :对于超级项目中的每次提交,您都会列出子项目中(单个)提交的SHA-1 ID。

对于完全静态的子项目来说这很好,但最终我们用实际拥有和使用分支的子项目构建东西,而不是永远坚持使用版本2.0(提交Y20)。因此,自从我上次使用它以来,git现在能够将分支名称与子项目相关联。

但是,您必须明确告诉git now 是时候更新子项目了:"请进入我的子项目,找到分支update --remote上的最新提交,并在我的超级项目中记录其SHA-1 ID。"当您使用feature/special设置该子模块时,这就是git submodule update --remote所做的(有几个额外的模式选项)。

此时,您的工作是测试整个事情并确保一切正常。如果 所有工作都可以,那么您可以在超级项目中进行新的提交。此新提交将记录您在-b输出中看到的新ID。旧的子项目ID(我在上面称为Y20)是git diff,而新的子项目(我上面称为Y47)现在是b45bfd8f498a4d86a9586e1a4b1a6194052274b0,这就是您在2334b1faa019c28c6fe75cef94fd94d847593c37中看到的内容

要将新的子项目ID添加到超级项目中(以便您现在可以提交它以进行测试并且已知可以正常工作),请在git diff向您显示的gitlink上使用git add,在这种情况下是git diff。在这里注意,我曾经一直被烦恼所困扰:

env

$ git add env # now ready to commit 中避免使用尾部斜杠,因为这会将整个子模块的内容添加到超级项目中!)。尾部斜杠的烦恼可能是固定的(git应该注意到不可能同时拥有gitlink条目git add env/和名为foo的文件/树。)

答案 1 :(得分:0)

使用-b从子模块中获取HEAD commit id并将其存储在客户端分支中。对子模块的后续提交会导致新的HEAD。在将子模块更新到新分支HEAD之后,我们看到存储的原始头和新头之间存在差异。

将ignore = all添加到.gitmodules会将其隐藏在分支用户中,但在所有情况下可能都不合适。