Copying Git Repos with History

Sometimes the Internet is great – you can find exactly what you’re looking for, quickly and easily. Other times, it takes you down a rabbit hole of different sites that may provide the right answer but, more often than not, the 90% rule is often true. 

So when we decided to consolidate our multiple git repos into a single repo on Azure Devops, I figured this should be relatively easy. Note: it isn’t built into git and while the final process isn’t that tough to follow, finding the best answer was extremely frustrating and time-consuming.

After several wrong paths, I came across this post. This covered the process in great detail – including some safety steps to ensure you don’t overwrite incorrect files. I’m finding that sometimes the dev posts on Medium are just as good as StackOverflow but provide the necessary context that may not be available there. I want to note it here as it took a very long time to find that article.

The key is the –allow-unrelated-histories parameter to the git merge command but in many other posts, there were lots of references to other parameters and additional steps. While those options may work, I prefer the approach with fewer commands and parameters. 

The starting point:

DocsRepo: Documentation Files
SourceRepo: Source Files for Project 1
ScriptsRepo: Database Scripts

Our desired end state was



Go to your new Repo

git remote add –fetch oldDocs
git merge oldDB/master –allow-unrelated-histories

This copies the files into the new repo but in their root folder.

mkdir Docs

Then manual copy (using VS Code or mv) all of the files into the new Docs folder.

git commit -m “Copied Docs folder”
git push

git remote rm oldDocs

Rinse and repeat.

The history in DevOps doesn’t appear to show the whole history but when you look at it in DevOps, the history shows “Copied Docs Folder” but then has a “Rename history” link under it. Clicking this link shows the entire history.

Problem solved! Thanks to Ayushya