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.
I think you could use
git-filter-branch
with the--parent-filter
option.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.
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.
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.