<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Dr. Ankita Mehta</title>
    <description>The latest articles on DEV Community by Dr. Ankita Mehta (@ankita_phd).</description>
    <link>https://dev.to/ankita_phd</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3905388%2F2ec330f8-c391-4542-b3a0-139fae8b813e.png</url>
      <title>DEV Community: Dr. Ankita Mehta</title>
      <link>https://dev.to/ankita_phd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ankita_phd"/>
    <language>en</language>
    <item>
      <title>How a global leasing company migrated from TFS 2018 to TFS 2020 without downtime or data loss</title>
      <dc:creator>Dr. Ankita Mehta</dc:creator>
      <pubDate>Mon, 04 May 2026 04:04:11 +0000</pubDate>
      <link>https://dev.to/ankita_phd/how-a-global-leasing-company-migrated-from-tfs-2018-to-azure-devops-without-downtime-or-data-loss-140c</link>
      <guid>https://dev.to/ankita_phd/how-a-global-leasing-company-migrated-from-tfs-2018-to-azure-devops-without-downtime-or-data-loss-140c</guid>
      <description>&lt;p&gt;Upgrading DevOps systems sounds simple. Until the system you’re replacing is still in active use.&lt;/p&gt;

&lt;p&gt;A global financial leasing company operating across 50+ countries faced this exact problem. Teams were working on TFS 2018, while Azure DevOps Server 2020 was already set up as the destination.&lt;/p&gt;

&lt;p&gt;This wasn’t just a migration. It was a transition that couldn’t afford to pause. The constraint most migrations ignore&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The trigger for the migration was simple:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TFS 2018 was being retired&lt;/li&gt;
&lt;li&gt;Azure DevOps Server 2020 was already in place&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the constraint changed everything:&lt;/p&gt;

&lt;p&gt;Teams were still actively working in TFS.&lt;/p&gt;

&lt;p&gt;This meant:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No downtime&lt;/li&gt;
&lt;li&gt;No disruption&lt;/li&gt;
&lt;li&gt;No data gaps. No confusion during transition&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most migrations don’t fail because data can’t be moved.&lt;br&gt;
They fail because work cannot pause while data is being moved.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What was actually at risk&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The legacy system wasn’t just a backlog.&lt;/p&gt;

&lt;p&gt;It contained:&lt;/p&gt;

&lt;p&gt;~5000 work items&lt;br&gt;
~30,000 revisions&lt;br&gt;
~15 GB of TFVC source code&lt;br&gt;
~5000 changesets&lt;/p&gt;

&lt;p&gt;That’s not just data.&lt;/p&gt;

&lt;p&gt;That’s:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;History&lt;/li&gt;
&lt;li&gt;Traceability&lt;/li&gt;
&lt;li&gt;Data richness&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lose any of it, and the new system becomes harder to trust than the old one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a simple “lift and shift” wouldn’t work
&lt;/h2&gt;

&lt;p&gt;A one-time migration would have created problems immediately:&lt;/p&gt;

&lt;p&gt;Teams would lose access during cutover&lt;br&gt;
Updates made during migration would be lost&lt;br&gt;
New item IDs would break continuity&lt;br&gt;
Users wouldn’t know how old work maps to new work&lt;/p&gt;

&lt;p&gt;So the goal wasn’t migration. It was operational continuity during migration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The approach:&lt;/strong&gt; move everything, pause nothing.&lt;/p&gt;

&lt;p&gt;Instead of treating migration as a single event, the team approached it as a controlled transition using &lt;a href="https://www.opshub.com/products/opshub-azure-devops-migrator/?utm_source=Rephrased+case+study+related+to+OM4DO+in+the+form+of+blog+on+Dev.to+platform&amp;amp;utm_medium=Blog&amp;amp;utm_campaign=Rephrased+case+study+related+to+OM4DO+in+the+form+of+blog+on+Dev.to+platform" rel="noopener noreferrer"&gt;OpsHub Migrator for Microsoft Azure DevOps (OM4ADO)&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The focus was clear:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Keep systems usable during migration&lt;/li&gt;
&lt;li&gt;Preserve every piece of history&lt;/li&gt;
&lt;li&gt;Reduce confusion for users&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What actually made the difference
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. No downtime during migration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Teams continued working in the existing system while data was being moved.&lt;/p&gt;

&lt;p&gt;No freeze. No productivity drop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Full history preservation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Work items were migrated with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All revisions&lt;/li&gt;
&lt;li&gt;Complete history&lt;/li&gt;
&lt;li&gt;Linked information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing had to be reconstructed later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Source code moved with continuity&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;TFVC source code and changesets were migrated along with work items.&lt;/p&gt;

&lt;p&gt;This ensured that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Development history stayed intact&lt;/li&gt;
&lt;li&gt;References remained meaningful&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Original ticket references were retained&lt;/strong&gt;&lt;br&gt;
     A small but critical decision&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Original ticket numbers were added to new items&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This solved a very real problem:&lt;/p&gt;

&lt;p&gt;“Where did my work go?”&lt;/p&gt;

&lt;p&gt;Instead of forcing users to relearn IDs, the system preserved familiarity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Continuous support during migration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This wasn’t a “run and forget” migration.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Issues were handled as they appeared&lt;/li&gt;
&lt;li&gt;Adjustments were made in real time&lt;/li&gt;
&lt;li&gt;Teams were supported throughout&lt;/li&gt;
&lt;li&gt;What changed after the migration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The visible change was simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Everything moved to Azure DevOps Server 2020.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The real impact was deeper&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Teams finally worked in one place&lt;/li&gt;
&lt;li&gt;Development, IT, and management teams aligned on a single system.&lt;/li&gt;
&lt;li&gt;Data became reliable again&lt;/li&gt;
&lt;li&gt;No duplication. No mismatch. No missing history.&lt;/li&gt;
&lt;li&gt;Reporting improved&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With unified data, reporting reflected reality instead of stitched views.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Decision-making became faster&lt;/li&gt;
&lt;li&gt;Stakeholders had access to complete, consistent information.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What this case actually teaches&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This wasn’t a complex migration story. It was a disciplined one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Migration is not a data problem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It’s a continuity problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. History is not optional&lt;/strong&gt;&lt;br&gt;
    Without it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Audits break&lt;/li&gt;
&lt;li&gt;Debugging slows&lt;/li&gt;
&lt;li&gt;Decisions lose context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Small details reduce big confusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Preserving original ticket references is not a technical feature.&lt;br&gt;
It’s a usability decision.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Downtime is not always required&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With the right approach, systems can transition without stopping work.&lt;/p&gt;

&lt;p&gt;If you’re planning something similar&lt;/p&gt;

&lt;p&gt;Ask these questions early:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can teams continue working during migration?&lt;/li&gt;
&lt;li&gt;How will history be preserved?&lt;/li&gt;
&lt;li&gt;How will users map old work to new work?&lt;/li&gt;
&lt;li&gt;What happens to updates made during migration?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you don’t answer these, migration becomes a mere cleanup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most teams think migration ends when data is moved.&lt;br&gt;
In reality, it ends when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Teams trust the new system&lt;/li&gt;
&lt;li&gt;Work continues without friction&lt;/li&gt;
&lt;li&gt;Nothing feels “lost”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s a much higher bar.&lt;/p&gt;

&lt;p&gt;And that’s what this migration got right.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A practical note&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For migrations involving TFS to TFS, TFS to Azure DevOps (ADO), ADO to ADO, merge multiple ADO instances, active source systems, large datasets, and strict continuity requirements, structured migration tools like &lt;a href="https://www.opshub.com/products/opshub-azure-devops-migrator/?utm_source=Rephrased+case+study+related+to+OM4DO+in+the+form+of+blog+on+Dev.to+platform&amp;amp;utm_medium=Blog&amp;amp;utm_campaign=Rephrased+case+study+related+to+OM4DO+in+the+form+of+blog+on+Dev.to+platform" rel="noopener noreferrer"&gt;OpsHub Migrator for Microsoft Azure DevOps (OM4ADO)&lt;/a&gt; co-built with Microsoft are often used to manage the transition without disrupting ongoing work.&lt;/p&gt;

&lt;p&gt;If you’re exploring similar TFS upgrades, it can be useful to see how other teams have approached it. &lt;a href="https://www.opshub.com/case-studies/csi-leasing-transforms-devops-leveraging-opshub/?utm_source=Rephrased+case+study+related+to+OM4DO+for+Dev.to+platform&amp;amp;utm_medium=Blog&amp;amp;utm_campaign=Rephrased+case+study+related+to+OM4DO+for+Dev.to+platform" rel="noopener noreferrer"&gt;Here’s a real example of a migration from an older TFS version to a newer setup&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I wrote this piece because most migration stories focus on tools, not what actually breaks during the transition. In reality, the hardest part is keeping work moving while everything underneath is changing.&lt;/p&gt;

&lt;p&gt;If you’re dealing with a similar migration, I’d love to hear how you’re approaching it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How are you handling active work during migration?&lt;/li&gt;
&lt;li&gt;What’s been the hardest part for your team?&lt;/li&gt;
&lt;li&gt;Are you prioritizing speed, continuity, or data completeness?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drop your thoughts or questions in the comments. Always interesting to see how different teams solve the same problem.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>devops</category>
      <category>automation</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
