将多个Git存储库与标记合并

时间:2013-07-29 21:23:25

标签: git tags multiple-repositories refspec

我正在使用许多不同的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结构非常笨拙。)

1 个答案:

答案 0 :(得分:5)

--no-tags用于:

是否有效?
git fetch fork1 refs/tags/*:refs/tags/fork1/* --no-tags

这会将fork1的标签丢弃到refs / tags / fork1中,而不会将它们放在refs / tags中。