Move files between git repositories with history

From time to time it may happen usuful to move files in the project from one git repository to the other one. The simplest way to do that is of course deleting it from one repository and adding in the other one. But with such move all history of edits of such files is lost. If the classes are of a bigger size it may be valuable to keep their history. So how to do that?

We need to start with the source repository (where the files are currently) to strip it down from all other files. To do so it is best advised to create a fresh clone, for example in some C:\tmp\old-repo location. And than use git filter-repo command to strip all other files:

git filter-repo \
    --path-regex ".*ClassOne.java$" \
    --path-regex ".*ClassTwo.java$" \
    --path-regex ".*ClassOneTest.java$" \
    --path-regex ".*ClassTwoTest.java$" \
    --prune-empty always --force

After that command only needed files (in the example two classes and tests for them) will be kept in the old-repo repository with their history. We can git mv them now to the location which they should have in the target-repo.

Now its time to work with a target-repo. We can add new remote repo here, fetch it and merge allowing unrelated histories:

git remote add sourceRepoName C:\tmp\old-repo
git fetch sourceRepoName
git merge sourceRepoName/main --allow-unrelated-histories