Skip to content

Instantly share code, notes, and snippets.

@trongthanh
Last active April 24, 2024 23:46
Show Gist options
  • Save trongthanh/2779392 to your computer and use it in GitHub Desktop.
Save trongthanh/2779392 to your computer and use it in GitHub Desktop.
How to move a folder from one repo to another and keep its commit history
# source: http://st-on-it.blogspot.com/2010/01/how-to-move-folders-between-git.html
# First of all you need to have a clean clone of the source repository so we didn't screw the things up.
git clone git://server.com/my-repo1.git
# After that you need to do some preparations on the source repository, nuking all the entries except the folder you need to move. Use the following command
git filter-branch --subdirectory-filter your_dir -- -- all
# This will nuke all the other entries and their history, creating a clean git repository that contains only data and history from the directory you need. If you need to move several folders, you have to collect them in a single directory using the git mv command.
# You also might need to move all your content into some directory so it didn't conflict with the new repository when you merge it. Use commands like that
mkdir new_directory/
git mv my_stuff new_directory/
# Once you've done commit your changes, but don't push!
git commit -m "Collected the data I need to move"
# This is all about the source repository preparations.
# Now go to your destination repository
cd ../my-repo2/
# And here is the trick. You need to connect your source repository as a remote using a local reference.
git remote add repo1 ../my-repo1/
# After that simply fetch the remote source, create a branch and merge it with the destination repository in usual way
git fetch repo1
git branch repo1 remotes/repo1/master
git merge repo1 --allow-unrelated-histories
# This is pretty much it, all your code and history were moved from one repository to another. All you need is to clean up a bit and push the changes to the server
git remote rm repo1
git branch -d repo1
git push origin master
# That's all. After that you can nuke the temporary source repository.
@shubhamwagh
Copy link

Works perfectly! Thanks.

@AiswaryaM
Copy link

Hi,

Iam following the same, but in the push getting following error.Kindly help

Total 4203 (delta 1720), reused 4202 (delta 1720), pack-reused 0
remote: Resolving deltas: 100% (1720/1720), done.
remote: Rejected by YACC
remote:
remote: (c).-.(c) (c).-.(c) (c).-.(c) (c).-.(c) (c).-.(c)
remote: / .. \ / .. \ / .. \ / .. \ / ..
remote: ( Y )/ ( Y )/ ( Y )/ ( Y )/ ( Y )/
remote: (
.-/'-'-.)(.-/'-'-.)(.-/'-'-.)(.-/'-'-.)(.-/'-'-._)
remote: || E || || R || || R || || O || || R ||
remote: .' -' '._ _.' -' '. .' -' '._ _.' -' '. _.' -' '. remote: (.-./-'.-.)(.-./-.-.)(.-./-.-.)(.-./-'\.-.)(.-./-\.-.) remote: -' -' -' -' -' -' -' -' -' `-'
remote:
remote:
remote: Push rejected.
remote:
remote: refs/heads/master: 1f77a4445ec: expected committer email 'xxxx@yyy.com' but found 'bbbb@yyy.com'
remote:
remote: refs/heads/master: be3b4b47d9a: expected committer email 'xxxx@yyy.com' but found 'bbbb@yyy.com'

@josealdaco
Copy link

noticed an issue when running git merge repo1 --allow-unrelated-histories to a repository with an existing main/master branch.
Scenario: copying over a branch in repo1 to repo2 with full commit history, repo2 already has an existing main and develop branch.
Problem: When running the last step of merging featurebranch from repo1 to repo2 using git merge repo1 --allow-unrelated-histories, it fails to completely copy the code from featurebranch in repo1.

Solution: before creating featurebranch in repo2, I ran git checkout --orphan featurebranch and git rm -rf . in this order. Since there is nothing to reference before running git merge repo1 --allow-unrelated-histories it will completely copy featurebranch from repo1 to repo2 with no conflicts.

If there are no main/master branches then this solution works just fine, Thanks! @trongthanh

@yuriy-lentsevich
Copy link

yuriy-lentsevich commented Oct 25, 2023

Is there any way to move the history under repo2/(target folder) ? because after migration it is available only under repo2 root folder ... The history of repo2/(target folder) shows only 1 commit : "Collected the data I need to move"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment