See other projects

Moving a directory in git to another repo

I wanted to move a directory from one repo to another, keeping the commit history and without introducing new noise to the commit history. Summarizing what I've learned from a few different sources, here's how I accomplished it.

Let's say we want to move only "dir/directory_src" of "repo_one" to "dir/directory_dest" of "repo_two" (using a shell in Linux):

mkdir ~/repos
cd ~/repos
git clone https://servername/repo_one
cd repo_one
(disconnect from any remotes)
git remote rm origin
(run the following and look at the resulting filenames to see if they look correct)
git ls-files -s | sed "s-\tdir/directory_src/-\tdir/directory_dest/-"
(rewrite history so that "dir/directory_src" moves to "dir/directory_dest")
git filter-branch --index-filter  'git ls-files -s | sed "s-\tdir/directory_src/-\tdir/directory_dest/-" | GIT_INDEX_FILE=$ git update-index --index-info && if [ -f "$" ]; then mv "$" "$GIT_INDEX_FILE"; fi' HEAD
(delete the directory .git/refs/original, it's a backup copy)
cd ~/repos/repo_one

(run the following and look that files in dir/directory_dest aren't included)
git ls-files | egrep -v ^dir/directory_dest/
(rewrite history and remove all other files)
git filter-branch --tree-filter 'rm -rf $(git ls-files | egrep -v ^dir/directory_dest/)' -- --all
(delete empty commits. optional)
git filter-branch --commit-filter 'git_commit_non_empty_tree "$@"' HEAD
Now let's copy the files into repo_two.
cd ~/repos
git clone https://servername/repo_two
cd repo_two
git remote add from_repo_one ~/repos/repo_one
git pull from_repo_one master
git remote rm from_repo_one
(after confirming that everything looks right,)
(run git push.)
"repo_two" should now contain "dir/directory_dest" and all of its contents.

Note: when using the filter to remove other files outside of the directory might keep files around if the names that contain spaces or tabs.

Moving files from one Git repository to another
How can I move a directory in a Git repo