使用Git子模块获取`svncopy --pin-externals`之类行为的最简单方法

问题描述 投票:0回答:1

目前我的项目以detached HEAD方式使用Git子模块。在常规开发工作流程的背景下,将子模块指向相应的远程分支的提示(git submodule add -b master ...)会更方便,因此子模块中最新的变化会自动考虑在内。但是,当创建必须保持不变的标记时,子模块链接必须固定在创建标记时使用的特定提交上。

在SVN中,只需将--pin-externals参数添加到标记创建命令即可实现此修复,但看起来Git没有直接等效的标记。我最好的选择是什么?

git git-submodules
1个回答
1
投票

TL; DR:这里没什么可做的。所有超级项目提交总是将所有内容都指向分离的HEAD。 -bs在提交时不会被使用,也不会在git adding时使用,只有当git submodule update --remoteing时,即使那时你仍然在一个独立的HEAD,只是一个不同的。


在Git中,子模块只是单独的Git存储库。超级项目提交始终记录将强制每个子模块的一个特定哈希。例如,如果您使用散列a123456进行了超级项目提交,那么超级项目的a123456已经固定每个子模块:子模块sub/A永远固定(对于此提交),例如,aaaaaaaa和子模块moduleB永远固定(对于此提交)到bbbbbbb。当你回到超级项目中提交a123456并运行git submodule update时,sub/A将分离到sub/Aaaaaaaaa,而moduleB将分离到bbbbbbb

要取消分离子模块,你必须cd sub/A; git checkout mastercd 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 adds的唯一用途是git submodule update --remote,即使这样,它也不是真正使子模块在分支上,它只是自动更新子模块的detached-HEAD。

© www.soinside.com 2019 - 2024. All rights reserved.