目前我的项目以detached HEAD
方式使用Git子模块。在常规开发工作流程的背景下,将子模块指向相应的远程分支的提示(git submodule add -b master ...
)会更方便,因此子模块中最新的变化会自动考虑在内。但是,当创建必须保持不变的标记时,子模块链接必须固定在创建标记时使用的特定提交上。
在SVN中,只需将--pin-externals
参数添加到标记创建命令即可实现此修复,但看起来Git没有直接等效的标记。我最好的选择是什么?
TL; DR:这里没什么可做的。所有超级项目提交总是将所有内容都指向分离的HEAD。 -b
s在提交时不会被使用,也不会在git add
ing时使用,只有当git submodule update --remote
ing时,即使那时你仍然在一个独立的HEAD,只是一个不同的。
在Git中,子模块只是单独的Git存储库。超级项目提交始终记录将强制每个子模块的一个特定哈希。例如,如果您使用散列a123456
进行了超级项目提交,那么超级项目的a123456
已经固定每个子模块:子模块sub/A
永远固定(对于此提交),例如,aaaaaaaa
和子模块moduleB
永远固定(对于此提交)到bbbbbbb
。当你回到超级项目中提交a123456
并运行git submodule update
时,sub/A
将分离到sub/A
的aaaaaaaa
,而moduleB
将分离到bbbbbbb
。
要取消分离子模块,你必须cd sub/A; git checkout master
和cd moduleB; git checkout master
。您可以使用git submodule update --remote
半自动化,它使用记录的分支,但实际上做的不是将sub/A
切换到(它)master
而是通过哈希ID找出sub/A
的远程origin/master
是什么,并将sub/A
切换到该提交作为一个独立的HEAD。所以sub/A
将继续处于独立的HEAD模式。
在超级项目中使用git add
只需从每个子模块获取当前的HEAD
(通常是分离的,但即使不是,git rev-parse
报告的实际哈希ID)并将其记录在超级项目的索引中,以便一个哈希ID将在下一个超级项目提交。子模块中的分支名称在这里并不重要。在-b master
中使用那些git submodule add
s的唯一用途是git submodule update --remote
,即使这样,它也不是真正使子模块在分支上,它只是自动更新子模块的detached-HEAD。