2011-10-05 54 views
4

我已经设法将来自多个GIT存储库的分支合并到一个新的存储库(使用“git filter-branch”和“git fetch/merge”的组合)。但我似乎无法“融合”来自这些分支的标签......这甚至有可能吗?就我所知道的(相当有限的)GIT而言,标签指的是单个提交,它本身是由SHA1哈希值标识的,SHA1哈希值基本上是从所有先前的提交中计算出来的。由于来自不同储存库的分支没有共同的祖先提交,我很难想象如何在一个新的和完全的情况下以一种仍然“有意义”(以GIT方式)重写标签的方式无关的存储库。在保留所有标记/分支的同时合并多个GIT存储库

任何想法?

编辑:为了澄清我打算做的:

假设我有两个仓库,分别名为“A”和“B”,我想结合成所谓的“C”一个新的存储库。

的目录布局是一样的东西

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

,合并的仓库应该像

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

存储库在文件结构和历史方面如何相关?我的意思是他们分享什么? – CharlesB

+0

这两个存储库共享任何内容(一个存储库持有SQL来设置数据库(模式,存储过程等),另一个存储库存放将在后面访问该数据库的Java应用程序。由于Java代码依赖于特定版本的数据库模式,这是合理的结合这两个存储库,以便可以在两个模块上创建一个标签 – JavaGuy

+0

我认为,为了使任何答案更加完整,您需要(完全)定义您希望* history *看起来像,你可以做几个子树合并并完成,并且完全不相交A和B的历史,但我怀疑你正在寻找某种交错? – Cascabel

回答

2

标签是不是目录(如同在颠覆),所以取/合并将不会考虑他们。
加上git fetch默认不会获取所有标签(除非指定--tags)。

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


另一个不太侵入性的方式,以“结合”这两个回购协议将宣告ABsubmodules of C
不涉及合并,AB保持他们的分支和标签

+0

Hnm,这就是我已经怀疑的...也许我应该重新提出我的问题,并要求解决方案重新应用这些标签:) – JavaGuy

+0

因为我想结合我的仓库(除其他外),以​​便能够crea在所有模块中添加一个标签,GIT子模块在这里不会有帮助(因为不支持跨模块创建标签)。 – JavaGuy

+0

@JavaGuy:不支持跨模块创建标签?为什么是,他们是......在某种程度上。当您标记父回购时,您将标记引用,该引用对当前由所述父回购引用的子模块的确切提交进行标记。即使子模块本身不知道该标签,您也可以通过选择父回购的正确标签来获得这两种回购的准确提交。 – VonC

-1

如果你不想浪费了几个小时就可以了,我通过Python和dulwich做了一些类似的怪异回购管理。这是一次黑客攻击,但如果完成它值得几个小时或一小段时间,那就去做吧。

相关问题