如何防止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
答案 0 :(得分:0)
当你(1)指定-b feature/special
然后(2)使用update --remote
时,这就是你要求的。 (这两项都是此操作所必需的,虽然它是触发实际更新的update --remote
部分,您可以在{{{{}}之前添加,删除或调整-b
设置1}} - 但通常你不会,我认为你没有。)
因为我不使用子模块(对他们的替代名称过于熟悉,并且#34; sob-modules" :-)虽然他们最近肯定有所改进)但我真的不想提供建议在正确的方式"去做这个。但是,我可以解释潜在的机制以及所有这些相当复杂的Jenga-ish结构是如何产生的。
基本上,子模块只是一个简单的配对:
要使用这些提交,您还需要一个单独的存储库Y ...
换句话说,配对是超级项目中的提交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会将其隐藏在分支用户中,但在所有情况下可能都不合适。