Systems and records
Old TFS and Azure DevOps Server: preserving work item history
By SourceX Editorial · Updated
Short answer
To preserve work item history from an old TFS or Azure DevOps Server, back up every collection database first, then decide collection by collection whether to migrate or archive. Migration suits history people still use; an archive suits retired products. Either way, export revisions and TFVC changesets in readable form, because a backup needs a server to read.
Key takeaways
- Back up the configuration database and every collection database from the same point in time before any migration or shutdown.
- A work item's value is its revision trail and its links to changesets, not its final field values.
- Converting TFVC to Git for active work does not replace archiving the original TFVC history.
- Old domain accounts and custom process templates are the quiet failure points, so archive an identity map and the process definitions.
- Keep an unpatched TFS server only as a short bridge, never as the archive itself.
What history sits in an old TFS collection?#
An old TFS collection holds a company's engineering record in SQL Server: work items with every revision, TFVC changesets with check-in comments, shelvesets, branches and merges, build and test results, and the links between them. Each team project collection is its own database, alongside a configuration database that ties the deployment together.
Long-running software companies often find more than they expected. Collections from the early years may hold the only record of how core features were designed, which bugs customers reported before the current tracker existed, and which fixes shipped in which releases. Older versions often added a reporting warehouse and SharePoint project sites, which hold reports and documents rather than the source records.
| Record | What it shows | Easy to lose when |
|---|---|---|
| Work item revisions | Every field change, who made it and when | A migration tool copies only current values |
| History comments | Triage reasoning, customer context and decisions | Comments are flattened into one text field |
| Work item links | Parent and child items, related bugs, linked changesets and test cases | Items move to a new tracker with new IDs |
| TFVC changesets | Code changes with check-in comments and associated work items | TFVC is converted to Git with limited history |
| Shelvesets | Unfinished work and code sent for review | Only checked-in code is converted |
| Attachments | Screenshots, logs and customer files on bug reports | Exports keep the links but not the files |
| Process customizations | Meaning of custom fields, states and rules | Definitions are not archived with the data |
Migrate or archive: what each option keeps#
Migrating keeps history only for what moves cleanly, while archiving keeps everything but requires a way to read it later. The right answer usually differs by collection: an active product line may justify a careful move, while a collection for a retired product is better archived and left alone.
Microsoft documents upgrade paths for TFS and Azure DevOps Server and a separate path for importing collections into the cloud service, each with version prerequisites that change over time. Check the current documentation for your exact version before committing to a plan, and assume a very old collection may need intermediate steps.
| Option | Keeps | Usually loses | Fits when |
|---|---|---|---|
| Upgrade in place to a current Azure DevOps Server | The whole collection with revisions, TFVC and links | Little data, but you keep running and patching a server | Teams still work in the collection |
| Import the collection into Azure DevOps Services | The collection as a whole when prerequisites are met; confirm against current guidance | Collections that miss prerequisites; customizations need validation | You want the cloud service and the same tooling |
| Tool-based move to another tracker or Git platform | Current state of active items and recent code | Revision trails, changeset links and TFVC branch history, depending on the tool | You are leaving the Microsoft stack |
| Archive: backups plus a readable export | Everything, in a form the company controls | Day-to-day usability unless restored | The product is retired or history is rarely opened |
| Keep the old server read-only | Everything, still browsable | Security, as the operating system and SQL Server age | A short bridge while the archive is built |
- 01Your work records
- 02Personal details removed
- 03You approve the release
- 04Licensed to AI developers
Why TFVC history is the hardest part to move#
TFVC history is hard to move because centralized version control does not map neatly onto Git. TFVC branches are folders with recorded merge relationships, changesets are numbered across the whole collection, and each check-in can carry comments, policy overrides and associated work items. A Git conversion has to translate all of that into commits and branches.
Conversion tools make different trade-offs. Some bring only recent history or the tip of each branch, some flatten branch structure, and some drop the links between changesets and work items. Before choosing one, convert a test branch and compare a handful of changesets, including a merge, against the original.
The safe rule: if you convert TFVC to Git for ongoing development, archive the original TFVC history anyway. Export changesets with their comments, authors, dates, file lists and associated work item IDs, plus the branch hierarchy, so the reasoning behind old code survives even when the converted repository is simplified.
How to archive a TFS collection step by step#
Archiving a TFS collection means producing two things: a restorable backup and a readable export that does not need a server. Do both while the server, its service accounts and the people who administer it are still available.
- Inventory each collection, team project, TFS or Azure DevOps Server version, SQL Server version, process template and any file shares used for build drops.
- Back up the configuration database and every collection database from the same point in time, then checksum each file.
- Restore onto an isolated server of the same version and open old work items, changesets and attachments to prove the backup reads.
- Export every work item with all revisions, comments, links and attachments into files keyed by work item ID, including closed and removed items.
- Export TFVC changesets with comments, authors, dates, file lists, associated work item IDs and the branch hierarchy; mirror-clone any Git repositories and save their pull request threads.
- Archive the process template definitions and an identity map from old domain accounts to names and roles.
- Scan the export for secrets and personal details, restrict access to a named group, and record sign-offs before the server is retired.
Identities and process templates: the quiet failure points#
Identities are usually the first thing to break. TFS records people as domain accounts, and after a domain migration or years of staff turnover many of those accounts no longer resolve, so history can show unknown users or raw security identifiers. Export an identity map while the directory still knows who everyone was, with name, role and team rather than login names alone.
Process templates are where meaning breaks. Many teams customized work item types with fields such as root cause, customer impact or release note text, and with states that matched their own workflow. Without the process definitions, an archive holds values whose meaning nobody remembers, so save the definitions with the export and note which fields were used in which years.
Illustrative: a labeling software firm retires two old collections#
Illustrative: a fictional company that builds warehouse labeling and compliance software still runs a TFS server in a closet. Active development moved to Git on a cloud platform years ago, but two collections remain: one for the original desktop product and one for an integration toolkit that customers still use.
The CTO decides not to migrate either collection. The team backs up the configuration and collection databases, proves the restore on an isolated machine, and exports every work item revision, TFVC changeset and branch relationship, with an identity map built before the old domain is shut down. Shelvesets from the last release cycle are exported too.
The server is retired, removing an unsupported machine from the network. When an integration customer later reports a label format regression, engineers find the original bug, its triage comments and the changeset that fixed it in the readable export, which also becomes the reference entry in the company's records inventory.
How SourceX looks at an old TFS archive#
SourceX looks at an old TFS archive as a linked record of software work: bugs reported, triaged, fixed in changesets and verified in builds. In the Supply step of the SourceX five-step transaction, the fit check asks for metadata only, such as versions, collections, years covered and whether changesets link to work items.
Under the SourceX Enterprise Data Value Framework, an old archive can rate well on domain expertise and human-generated signal while rating lower on recency, and data cleanliness depends heavily on whether revisions and links survived. Rights review then checks for customer-funded code, contractor work and acquired products before anything is prepared, approved or delivered.
Frequently asked questions
Is a SQL Server backup of the collection enough on its own?
It preserves everything, but only a compatible TFS or Azure DevOps Server can read it, and keeping that environment available gets harder as versions age. Pair the backup with a readable export of work item revisions and changesets so the history stays usable without restoring a server.
What about TFS projects that already used Git?
Mirror-clone the Git repositories with all references, but remember that the review conversation does not live in Git. Pull request threads, reviewer votes and linked work items sit in the collection database, so export them separately and keep their original IDs.
Should we keep old build definitions and logs?
Keep build definitions as files, and keep logs for builds that produced shipped releases, because they show how a customer's version was built and tested. Full build drops can be large, so keep them only where a release still needs to be reproduced or supported.
Who owns the code and records in an old TFS collection?
Usually the company, but not always. Customer-funded custom development, contractor agreements and products bought from another company can carry different terms. Note those projects in the inventory so they can be reviewed separately before the history is used for anything beyond internal reference.
Can a current Azure DevOps Server open a very old TFS collection directly?
Not always. Older collections may need to pass through intermediate versions, and each step has its own operating system and SQL Server requirements. Check Microsoft's upgrade guidance for your exact version and rehearse the path on a copy before touching production.
Related resources
See if your company qualifies
A short company assessment. No data uploads are needed.