Merging two Git repositories
我有一个一Git项目,文件结构如下:
我有另一个Git项目,文件结构如下:
1 2 3
| Project_B/
Project_A/files...
files... |
号
现在,我想将项目A合并到项目B中,并继续使用项目B作为唯一的存储库。
我尝试使用子树合并,但在说"条目'xxx'与'xxx'重叠"时出错。
有没有一种方法可以将项目A合并到项目B中并保留所有提交历史记录?
事先谢谢!
- 在重叠的情况下,哪个存储库应该获胜?
- @DirtyTofu刚刚用移植技术完成了我的答案,也许在您的案例中是一个更合适的解决方案。
- @理想情况下,我想合并这两个。
- 另请参见如何合并两个Git存储库?.
你可以这样做:
在项目"A"中,将新项目"A"设为子目录,并将所有内容都放入其中,因此项目"A"现在看起来像
1 2
| Project_A/
Project_A/files... |
然后,在项目B中:
1 2 3 4 5
| git remote add project_A Project_A
git fetch project_A
git branch project_A project_A/master
git checkout -b merge_trial master
git merge project_A |
号
…如有必要,在合并试验(或起泡,漂洗,重复,直到你得到你想要的冲突/重叠)。
作为SVN->Git迁移的一部分,我实际上做了类似的事情。
- 除了git mv,还有一种方法可以移动我的文件,以便我在项目_a中以前的所有提交也显示为新的修改结构吗?我认为这与Git过滤器分支有关,但我还没有测试过这个命令。
- 是的,您可以使用git过滤器分支来完成相同的事情。不过,在这种情况下,git mv可能更简单。在任何情况下,当你把项目"A"带到项目"B"中时,所有的历史都会随之而来。
- 这对我很管用!谢谢!
- 作为记录,这项工作代替了git mv:git filter-branch --tree-filter 'FILES=$(ls 1 | grep -v Project_A); mkdir -p Project_A; mv $FILES Project_A' HEAD。在project_A上执行此操作,将所有内容向下移动一个目录。
- 也就是说,过滤器分支手册页上的最后一个示例具有更安全的方法。
- 感谢Daniel提供了过滤器分支示例。
如果projectB已经包含projectA作为子模块,您应该:
- 首先删除projectA作为projectB的子模块。
- 然后尝试合并子树
如果projectA不是projectB的子模块,我建议将projectA提取到projectBrepo中,然后使用嫁接技术将两个提交行连接在一起,而不处理经典合并所涉及的所有合并冲突。
参见问题Git问题:是否可以通过相同的存储库合并两个不同的存储库?
- 你是说"子树合并"?虽然我更喜欢沉水树。
- @ebneter:已修复。我不应该在早上6点回答问题;)
- 项目"A"目前不是项目"B"的子模块。两个独立的开发库是由两个不同的团队启动的,现在我正试图将我的团队库合并到他们的团队库中,但是项目的不同文件结构似乎给我带来了一些问题。