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