【问题标题】:Merging two Git repositories合并两个 Git 存储库
【发布时间】:2010-02-10 02:03:19
【问题描述】:

我有一个 git 项目,其文件结构如下:

    Project_A/files...

我有另一个文件结构如下的 git 项目:

    Project_B/
        Project_A/files...
        files...

现在我想将项目 A 合并到项目 B 并继续使用项目 B 作为唯一的存储库。

我尝试使用子树合并,但出现错误提示“条目 'XXX' 与 'XXX' 重叠”

有没有办法将项目 A 合并到项目 B 并保留所有提交历史记录?

提前致谢!

【问题讨论】:

  • 在重叠的情况下哪个存储库应该胜出?
  • @dirtytofu 刚刚用移植技术完成了我的回答,在你的情况下可能是更合适的解决方案。
  • @gbacon 理想情况下,我想将两者合并。

标签: git


【解决方案1】:

你可以这样做:

在 Project_A 中,创建一个新的 Project_A 子目录并将所有内容 git mv 放入其中,因此 Project_A 现在看起来像

Project_A/
    Project_A/files...

然后,在 Project_B 中:

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

... 并根据需要在 merge_trial 上进行修复(或起泡、冲洗、重复,直到获得您想要的关于冲突/重叠的内容)。

作为 svn->git 迁移的一部分,我实际上已经完成了类似的操作。

【讨论】:

  • 有没有办法移动我的文件而不是 git-mv,以便我以前在 Project_A 中的所有提交也显示为新的修改结构?我认为它与 git-filter-branch 有关系,但我还没有测试过这个命令。
  • 是的,你可以使用 git filter-branch 来完成同样的事情。不过,在这种情况下, git mv 可能会更容易。无论如何,当您将 project_A 提取到 Project_B 时,所有的历史都会随之而来。
  • 为了记录,这可以代替git mvgit filter-branch --tree-filter 'FILES=$(ls 1 | grep -v Project_A); mkdir -p Project_A; mv $FILES Project_A' HEAD。在project_A 上执行此操作,将所有内容移到一个目录下。
  • 也就是说,filter-branch 手册页上的最后一个示例似乎更安全。
  • 感谢 Daniel,提供 filter-branch 示例。
【解决方案2】:

如果projectB 已经包含projectA 作为submodule,您应该:


如果projectA 不是projectB 的子模块,我建议将projectA 提取到projectB 存储库中,然后使用graft 技术 将两个提交行链接在一起,虽然没有处理经典合并可能涉及的所有合并冲突。

见问题Git question: possible to merge two different by equal repositories?

【讨论】:

  • 你的意思是“子树合并?”虽然我更喜欢淹没树。
  • @ebneter:已修复。我不应该在早上 6 点回答问题;)
  • Project_A 目前不是 Project_B 的子模块。两个单独的开发存储库由两个不同的团队启动,现在我正在尝试将我的团队存储库合并到他们的存储库中,但是项目的不同文件结构似乎给我带来了一些问题。
猜你喜欢
  • 2010-11-28
  • 1970-01-01
  • 2015-06-28
相关资源
最近更新 更多