我正在使用许多不同的Git repos,需要合并在一起.工作流程如下所示:
git remote add fork1 ...
git remote add fork2 ...
git fetch fork1
git fetch fork2
git merge fork1/master fork2/master
Run Code Online (Sandbox Code Playgroud)
这一切都很好,但我希望能够使用标签提取每个远程的特定提交:
git merge fork1/v1.0.0 fork2/v2.1.0
Run Code Online (Sandbox Code Playgroud)
永远不应该有任何合并冲突,因为每个repo都会将其更改限制在一个子文件夹中,但即使存在,章鱼合并也会导致整个事务以原子方式失败.
问题在于标签引用.正如本博文中所述(不是我的),所有标签都被莫名其妙地转储到全局命名空间中.没有办法说fork1/v1.0.0
- 只是v1.0.0
,如果多个存储库具有相同的标记,它们会相互挤压.
在这个答案之后,我一直在研究使用refspec来解决这个问题.到目前为止,我已经提出以下建议:
git fetch fork1 refs/tags/*:refs/tags/fork1/*
Run Code Online (Sandbox Code Playgroud)
这具有使fork1的v1.0.0
标签到达的预期效果fork1/v1.0.0
.不幸的是,它也以非命名空间的形式出现v1.0.0
; git fetch
在标记映射部分打印出两倍的行,并且git merge v1.0.0
仍然与提取的标记合并.我无法在任何地方找到关于refspecs的好文档(Git关于该主题的文档非常无用).
如何防止多个存储库中的标记相互冲突?
如果我只是愚蠢地谈论这个问题,我也会接受其他工作流建议.我有一个核心仓库,它包含共享组件和结构,以及一些模块repos,它们是核心的完整克隆,只添加了代码.我目前的计划是让每个模块都有一个指向核心的远程指针(以保持共享部分的最新状态)以及它所依赖的每个其他模块.共享位将合并,因为它们是相同的,并且模块位将合并,因为它们是独立的.我应该遵循另一种模式吗?(我避免使用子模块,因为(a)我从来没有听说过有关它们的任何好处,而且(b)共享部分是项目目录结构的顶级部分,这使得repo结构非常笨拙.)