Skip to content

Instantly share code, notes, and snippets.

@desolat
Forked from trongthanh/gist:2779392
Last active February 5, 2021 05:42
Show Gist options
  • Save desolat/3245e7616c8b5bb4daa180a02f8a1edf to your computer and use it in GitHub Desktop.
Save desolat/3245e7616c8b5bb4daa180a02f8a1edf 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
# see also: https://medium.com/@ayushya/move-directory-from-one-repository-to-another-preserving-git-history-d210fa049d4b
# 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
# For safety remove the origin ref:
git remote rm origin
# Remove unneeded branches, ... (will slim the .git folder)
git stash clear
git branch ...
# 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.
# Remove the "original" refs?
# Clean the unwanted data:
git reset --hard
# https://stackoverflow.com/a/5277575/47407
git reflog expire --expire=now --all
git repack -ad # Remove dangling objects from packfiles
git gc --aggressive --prune=now
git clean -fd
# 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/
# 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_master remotes/repo1/master
git merge repo1_master --allow-unrelated-histories
# or:
git pull repo1 master --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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment