If you are reading this, you are close to migrate from TFS TFVC to Git. Moving to Git is rather good decision, so congratulations! But calm your horses… How will you do this? What are your needs?
*Many people refer to TFVC (source code version system in TFS) as TFS (Team Foundation Server – system to manage tasks, builds, CI/CD, tests, source code). Try to keep in mind that TFVC and TFS are different tools.
If you do not need to take history of source code with you, just copy-paste source code from TFVC to Git. That’s all. Keep old TFVC repository in read-only mode just for case when you need to track history.
History, small repository
If you need to have history migrated and your repository is small (<1GB), just give a try to TFS built-in mechanism. TFS can migrate TFVC repository to Git by itself, together with history. Details can be found here.
History, big repository
Here we come to most common enterprise scenario. Big, massive repository with multiple branches and checkins. The tool to use is called git-tfs. It is two-way bridge between TFVC and Git. I used that tool to migrate 5 big TFVC repositories till now and everyone was happy! So, let’s get cracking!
Install Git and git-tfs
choco install git choco install gittfs
Examine TFVC repository
Run below command to examine what root branches do you have. If your code is placed in folder instead of branches, you need to convert folder to branch. Instead of http://tfs:8080/tfs/DefaultCollection just place url to your TFS collection.
git tfs list-remote-branches http://tfs:8080/tfs/DefaultCollection
You should see output similar to this:
TFS branches that could be cloned : $/project/trunk [*] | +- $/project/branch1 | +- $/project/branch2 | +- $/project/branch3 | +- $/project/branch3-1 Cloning root branches (marked by [*]) is recommended!
As stated above, you should clone only root branches, denoted as [*].
Go to directory where your brand new Git repository should be placed. Then fire this command:
MSYS_NO_PATHCONV=1 git tfs clone http://tfs:8080/tfs/DefaultCollection $/project/trunk . --branches=none
Migrate from TFS TFVC to Git!
Do not create new branches when migrate from TFS TFVC to Git. It can mess the history and branching points.
Init branches you want to migrate or all at once (–all).
git tfs branch --init --all
Now, let’s migration begin.
git tfs fetch --all
Above command may take even few hours. When it finishes, run it again, until you are sure that all was migrated. Some leftovers may still exist in TFVC because:
- TFVC likes to cheat us and report that all is fetched, but it is not (!!!)
- Someone else has commited to TFVC in the meantime
If there is nothing more to migrate, just add remote to shared Git repository (I assume new GitRepository located on the same TFS Collection, replace with your uri).
git remote add origin http://tfs:8080/tfs/DefaultCollection/_git/GitRepository
Now create branches from TFVC’s remotes and push them to new Git repository.
git checkout master git rebase remotes/tfs/default master git branch -r | xargs -I BR git rebase remotes/tfs/BR BR git push origin *:*
git branch -r | xargs -I BR git rebase remotes/tfs/BR BR
you can copy branches you need, filtering them with regex like in command below:
git branch --list 'your-regex' | xargs -I BR git rebase remotes/tfs/BR BR
Congratulations! You have just migrated from TFS TFVC to Git repository with whole history. It is still reasonable to leave TFVC repository in read-only mode as backup.