合并多个GIT仓库同时保留所有标签/分支

4
我已经成功地将多个GIT存储库的分支合并为一个新的存储库(使用“git filter-branch”和“git fetch/merge”的组合)。但我似乎无法“合并”这些分支的标签...这是可能的吗?就我(相当有限的)GIT知识而言,标签指的是由SHA1哈希值标识的单个提交,该哈希值基本上是从所有前面的提交计算出来的。由于来自不同存储库的分支没有共同的祖先提交,因此我很难想象如何重写标签以使其在全新且完全不相关的存储库的上下文中仍然“有意义”(以GIT方式)。

有任何想法吗?

编辑:为了澄清我的意图:

假设我有两个名为“A”和“B”的存储库,我想将它们合并为一个名为“C”的新存储库。

目录结构类似于

A
|
|-someFileA
|-anotherFileA
|-...
B
|
|-someFileB
|-anotherFileB
|-...

合并后的存储库应如下所示

C
|
|-A
| |-someFileA
| |-anotherFileA
| |-...
|
|-B
| |-someFileB
| |-anotherFileB
| |-...

1
它们的存储库在文件结构和历史记录方面有何关联?我的意思是它们共享什么? - CharlesB
这两个代码库没有共享的内容(一个代码库包含用于设置数据库(模式、存储过程等)的SQL,另一个代码库包含稍后将访问此数据库的Java应用程序。由于Java代码依赖于特定版本的数据库模式,因此将两个代码库合并起来是有意义的,以便可以在两个模块之间创建标签。 - JavaGuy
我认为为了让任何答案更完整,你需要(完全)定义你想要的历史记录是什么样子。你可以只做一些子树合并就完成了,并且A和B有完全不同的历史记录,但我怀疑你正在寻找某种交错方式? - Cascabel
2个回答

2

标签不是目录(如在Subversion中),因此fetch/merge不会考虑它们。
此外,默认情况下git fetch不会获取所有标签(除非指定--tags)。

考虑到标签引用了不可变的内容,并且您通过合并修改了该内容,我认为您无法轻松地保留它们,除非您手动将类似名称的标签重新应用于您认为与原始标记相似的提交。


另一种较少侵入性的“组合”这两个存储库的方法是将AB声明为C子模块
没有涉及合并,并且AB保留其分支和标签。


嗯,这正是我已经怀疑的...也许我应该重新表达我的问题,并寻求重新应用这些标签的解决方案 :) - JavaGuy
由于我想要合并我的存储库(以及其他一些东西),以便能够在所有模块中创建标签,GIT子模块在这里无法帮助(因为不支持跨模块创建标签)。 - JavaGuy
@JavaGuy: 跨模块创建标签不被支持?是的,它们是可以的...以某种方式。当您为父版本库打标签时,您正在为当前由该父版本库引用的子模块的确切提交引用打标签。即使子模块本身不知道该标签,您也可以通过选择正确的父版本库标签来获取两个版本库的精确提交。 - VonC

-1

如果你想在这上面浪费几个小时,我之前用Python和dulwich做过一些类似的奇怪的仓库管理。这只是一个临时的hack,但如果花几个小时或时间来完成它是值得的,就去做吧。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接