2012-06-03 73 views
9

我有一堆git存储库,每个包含一个文件。我想将它们合并到一起,最好一步完成。什么我的目标就是这个图:Git章鱼与不相关的存储库合并

*----¬ mergedrepo/master 
| \ \ \ 
| | | * repoA/master 
| | * repoB/master 
| | | 
| | * repoB/... 
| * repoC/master 
* repoD/master 
| 
* repoD/... 

我尝试了git merge,但它出现在章鱼策略脱节树木

$ git merge a/master b/master c/master d/master 
Unable to find common commit with a/master 
Automatic merge failed; fix conflicts and then commit the result. 

我还被告知git merge --squash将有助于不起作用,但那给了同样的错误。

这将产生右图,但失去了所有的文件:

$ git merge -s ours a/master b/master c/master d/master 

我如何去这样做呢?

+0

你的章鱼合并会起作用,你只需要解决像消息说的冲突。一旦你解决了冲突,你应该能够提交。 –

+2

@CharlesBailey:没有冲突! – Eric

+0

是的,有:“自动合并失败;修复冲突,然后提交结果。”。要解决冲突,如果文件不在存储库中共享任何相同的名称,则可能只需添加所有冲突的路径。 –

回答

3

创建一个空的承诺

git commit -m "Common commit" --allow-empty 

看看它的哈希值与log -1,并把它添加到移植的文件,没有任何父母

echo HASH_OF_COMMON_COMMIT >> .git/info/grafts 

然后找到所有其他的根源与log --max-parents=0并为每个添加他们使用上述散列将散列值与上述散列值作为父项

each HASH_OF_ROOT HASH_OF_COMMON_COMMIT >> .git/info/grafts 

现在,合并!

移植文件是一种方式来更改提交的父母,并且一旦您的所有回购有一个共同的提交你的回购应该接受合并。

4

我设法解决与无关分支的章鱼合并问题。 不幸的是,以下情况仅适用于不存在实际合并冲突的相当简单的情况。

  1. 按照OP中所述进行合并。它将“失败”宣称冲突。但合并已经完成,并且记录了这一事实,尽管索引没有变化。
  2. 添加分支内容索引与read-tree命令:

    git read-tree a/master b/master c/master d/master

    这不会影响工作树,只有索引将被更新。

    如果分支机构不是完全独立的,那么请调整它们的顺序,记住后者将覆盖前分支机构的内容。

  3. 正常提交。
  4. 执行硬重置(git reset --hard)以获得一致的工作树。

我想以后可以编辑和修改这个提交,但我个人还没有尝试过。

+0

你可能是指'git read-tree ...'而不是'git read-subtree ...'。另外,我敢打赌,如果你给每个步骤提供代码示例,例如'git reset --hard',步骤4,读者会很感激。 –

+0

哦,确实是'read-tree'。感谢澄清这一点。 – Vertigo

+1

如果其他人无法解决这个问题:虽然你没有在'git merge'命令中包含你正在合并的分支的名字,你应该将它包含在'git read-tree'命令中。 – dave4420