Let’s say you’ve just migrated your code from another version control system to TFS2010 by grabbing the old code, copying it into your workspace as is, and then checking it in to TFS as a single massive import. It’s a really easy and common way to do tip migration.
When you do this, you will notice that all your branch relationships are missing and source control will look something like this:
The old system had Trunk branched to Feature X and Version 1, etc, but now there’s no relationships and trying to merge from Trunk to a branch brings up a dialog with no targets.
Bummer, huh? Yeah, but what did you expect would happen? You’ve just imported a bunch of folders from the file system and TFS has no way of knowing that they’re branches.
We need to let it know which folders the branches are and the relationships between them. Here’s how we do it:
Step 1: Convert Folders to Branches
Right click the trunk folder (or whatever your root branch folder is) and convert it to a branch.
It should now look like this:
Do this for all the other target branches you have. e.g. Feature X and Version 1.
Step 2: Perform a Baseless Merge
Next, perform a TFS baseless merge to establish a relationship between the parent branch and the child branches. Don’t worry about the contents, we’re only going to merge the folder, not it’s contents.
TFS baseless merges are performed via the command line, so open up your VS2010 command prompt and do the following:
cd <workspaceFolder>
tf merge /baseless <trunk> <childBranch>
Check in your pending changes.
Step 3 Reparent Child Branches
At this point we have a loose link between the branches but the relationships are still not finalised. We need to fix that.
Select your child branch in Source Control Explorer and from the File menu choose Source Control –> Branching and Merging –> Reparent... NOTE: This is not available via the context menu in Source Control Explorer.
In the dialog box, choose the appropriate branch as the new parent. There generally should only be one, unless you have done multiple baseless merges.
Now look at the properties of your child branch and you should see something like this:
Excellent! If you go to your Trunk branch and in the branch context menu choose View Hierarchy. You should see something like this:
Brilliant. Now we’re all done. You can carry on using TFS as you normally would.
Enjoy!
Love this post - will definitely find a use. (although my new work is SVN only... for now)
ReplyDeleteYou write: "Select your child branch in Source Control Explorer and from the File menu choose Source Control –> Branching and Merging –> Reparent... NOTE: This is not available via the context menu in Source Control Explorer." And then you have an image of a context menu. Very confusing
ReplyDelete@Anonymous That's not a context menu screenshot, it's a screenshot of the relevant part of the File menu :-)
ReplyDeleteHi Richard,
ReplyDeleteWe recently migrated VSS with full history directly to TFS (and we have a Trunk, Release1, Release2... folders).
Is it possible to use this technique if files in both (former) branches have history?
Regards,
Alex
Hi Richard
ReplyDeleteHope you're well!
Great and wonderfully articulated post!
I was missing the 'baseless merge' step which allows me to reparent.
Thanks heaps.
Paul Sorauer
Hi,
ReplyDeleteThanks to your excellent post I managed to recreate all the source code branches after moving our source code to a new TFS server!
Valery.
This is part of the answer, but I'm having some other serious issues...
ReplyDeleteFor example, if I select the branch and then select "Merge", the new relationship shows up fine.
But if I select anything under that (a file, a folder, anything), the relationship is NOT present.
Shouldn't it be? What point is a branch/merge relationship that doesn't apply to the children as well? How do I get it to? Do I have to do this process for every folder under the branch? That doesn't seem right (I shouldn't have to make EVERY folder into a branch!)
Any help?
Thank you! Exactly what I needed.
ReplyDeleteReally nice article, helped me a lot!
ReplyDeleteThank you, Richard! This saved my butt. Last December we moved code from one team project to another. It wasn't until yesterday that we figured out that our branch relationships were broken. While your article doesn't address this exact scenario, you led us to a resolution.
ReplyDeleteFor us, after executing tf merge /baseless and checking in, the re-parent dialog was empty. We later found that they were already there, they just weren't wired up correctly. To fix our issue, we did this:
1) Convert all branches back to folders (including those in the old, deleted team project)
2) tf merge /baseless for each of the branch relationships
3) Check in
4) Convert each previous branch folder back to a branch (turn off the recursive option)
6 years later, your still helping people! FWIW, this was in TFS 2015 update 1.