如何将一个回购改为另一个回购

时间:2010-02-11 20:27:15

标签: git version-control merge repository

假设我有两个不同的存储库,如下所示:

Project 1:
Init---A---B---C---HEAD1

Project 2:
Init---D---E---F---G---HEAD2

有没有办法将Project 1(Init to HEAD)重新绑定到Project 2的Init提交,所以它看起来像这样:

Project 1 & 2:
     A---B---C---HEAD1
   /
Init---D---E---F---G---HEAD2

项目1&项目2是类似的。主要区别在于它们的文件结构略有不同:

Project1:

MyProject/
    File1
    File2
    File3

Project2:

MyParentProject/
    MyProject/
        File1
        File2
        File3
    SomeFolder/
    SomeOtherFolder/
    ...etc/

仅供参考:MyProject不是MyParentProject的子模块。 MyProject和MyParentProject作为两个独立的git存储库存在于两个不同的位置。

4 个答案:

答案 0 :(得分:12)

您可以将一个视为另一个的远程存储库。在Project1中,运行以下命令:

git remote add project2 <path_to_project_2>
git fetch project2
git branch --track project2Branch project2/master
git checkout project2Branch

使用git log查找该分支的初始提交的哈希值(即Project2)。然后运行

git checkout master # or whatever branch you want to rebase
git rebase <hash-for-commit>

您现在已经使用Project2重新命名了Project1。因为这听起来像是一次性操作,你只能使用一个存储库,你可以用

清理
git remote rm project2

现在,您的主分支使用Project2的init进行重新定义,而project2Branch具有Project2的其余历史记录。这有点像黑客,但它会做你想要的。

答案 1 :(得分:0)

我认为您可以将git-filter-branch--parent-filter选项一起使用。

答案 2 :(得分:0)

我使用的解决方案如下:

  • 项目2

    git format-patch <commit> --stdout > /path/to/patch.diff
    

    <commit>指的是&#34;来自&#34;的第一次提交。您希望合并到&#34; target&#34;。

  • 的存储库
  • 项目1

    git am /path/to/patch.diff
    

这会将项目2 中的<commit>HEAD的每次提交重播到项目1

这完全避免了项目之间需要共同的祖先,因为大多数git特定的工具都需要。

答案 3 :(得分:0)

您可以先将其他仓库添加到当前仓库作为远程仓库,然后执行rebase --onto,以便在第一个仓库中将一系列提交从一个仓库改为一个常见提交点。

git remote add project2 <...>
git checkout project2-master
git rebase -s recursive -X theirs --onto \
    project1-first-commit project2- start-commit project2-end-commit

大致相同。如果存在冲突,我还指定合并策略以使用来自project2的提交。您可能想要使用其他东西。但是在这里我们假设project2是“正确”代码而project1只是一个远程主代码。