如何将一个存储库重新设置为另一个存储库

发布于 2024-08-20 18:22:00 字数 660 浏览 3 评论 0原文

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

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

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

有没有办法将项目 1(Init 到 HEAD)重新设置为项目 2 的 Init 提交,因此它看起来像这样:

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

项目 1 和项目 1 的内容项目2类似。主要区别在于它们的文件结构略有不同,如下所示:

Project1:

MyProject/
    File1
    File2
    File3

Project2:

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

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

Let's say I have two different repositories like so:

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

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

Is there a way to rebase Project 1 (Init to HEAD) to the Init commit of Project 2 so it looks like this:

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

The content of Project 1 & Project 2 are similar. The main difference is that their file structure is slightly different like so:

Project1:

MyProject/
    File1
    File2
    File3

Project2:

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

FYI: MyProject is not a submodule of MyParentProject. MyProject and MyParentProject exist in two separate locations as two separate git repositories.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

鸢与 2024-08-27 18:22:00

您可以将其中一个视为另一个的远程存储库。在 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

因此现在您的 master 分支已使用 Project2 的 init 进行了重新基础,并且 project2Branch 拥有 Project2 的其余历史记录。这有点像黑客,但它会做你想做的事。

You could treat one as a remote repository to the other. In Project1, run these commands:

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

Use git log to find the hash for the initial commit of that branch (which is Project2). Then run

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

You've now rebased Project1 with Project2. Since this sounds like a one time operation, where you'll then only be using the one repository, you can cleanup with

git remote rm project2

So now your master branch is rebased with the init of Project2, and project2Branch has the rest of the history of Project2. It's sort of a hack, but it will do what you want.

洒一地阳光 2024-08-27 18:22:00

您可以首先将另一个存储库作为远程存储库添加到当前存储库,然后执行 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只是一个远程主机。

You can add the other repo to your current repo first as a remote and then do a rebase --onto to rebase a range of commits from one repo to a point of common commit in the first repo.

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

Roughly like that. Not that I also specify merge strategy to use the commits from project2 if there are conflicts. You may want to use something else. But here we assume that project2 is "correct" code and project1 is just a remote master.

感性 2024-08-27 18:22:00

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

I think you could use git-filter-branch with the --parent-filter option.

梦开始←不甜 2024-08-27 18:22:00

我使用的解决方案如下:

  • 项目2中:

    git format-patch ; --标准输出> /path/to/patch.diff
    

    其中 指的是您希望合并到“目标”的“来源”存储库中的第一个提交。

  • 项目 1 中:

    git am /path/to/patch.diff
    

这会重播项目 2 中从 HEAD 的每次提交项目1

这完全避免了项目之间对共同祖先的需要,正如大多数特定于 git 的工具所需要的那样。

The solution I used was as follows:

  • In Project 2:

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

    Where <commit> refers to the first commit in the "from" repository you wish to merge to the "target".

  • In Project 1:

    git am /path/to/patch.diff
    

This replays every commit from <commit> to HEAD in Project 2 onto Project 1.

This completely avoids the need for a common ancestor between the projects, as most git-specific tools require.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文