如何将一个存储库重新设置为另一个存储库
假设我有两个不同的存储库,如下所示:
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您可以将其中一个视为另一个的远程存储库。在 Project1 中,运行以下命令:
使用 git log 查找该分支(即 Project2)的初始提交的哈希值。然后运行
您现在已经用 Project2 重新设置了 Project1 的基础。由于这听起来像是一次性操作,因此您将只使用一个存储库,因此您可以使用以下命令进行清理,
因此现在您的 master 分支已使用 Project2 的 init 进行了重新基础,并且 project2Branch 拥有 Project2 的其余历史记录。这有点像黑客,但它会做你想做的事。
You could treat one as a remote repository to the other. In Project1, run these commands:
Use git log to find the hash for the initial commit of that branch (which is Project2). Then run
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
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.
您可以首先将另一个存储库作为远程存储库添加到当前存储库,然后执行 rebase --onto 将一个存储库中的一系列提交重新设置为第一个存储库中的公共提交点。
大致就是这样。并不是说如果存在冲突,我还指定了合并策略以使用来自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.
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.
我认为您可以将 git-filter-branch 与
--parent-filter
选项一起使用。I think you could use
git-filter-branch
with the--parent-filter
option.我使用的解决方案如下:
在项目2中:
其中
指的是您希望合并到“目标”的“来源”存储库中的第一个提交。在项目 1 中:
这会重播项目 2 中从
到HEAD
的每次提交到项目1。这完全避免了项目之间对共同祖先的需要,正如大多数特定于 git 的工具所需要的那样。
The solution I used was as follows:
In Project 2:
Where
<commit>
refers to the first commit in the "from" repository you wish to merge to the "target".In Project 1:
This replays every commit from
<commit>
toHEAD
in Project 2 onto Project 1.This completely avoids the need for a common ancestor between the projects, as most git-specific tools require.