如何跨project collection迁移TFVC代码并保留历史(TFS2017 Update3)
嘿,针对你在TFS2017 Update3里要把TFVC部分代码迁移到另一个项目集的空项目、还得保留历史(注释、操作人、时间、变更内容,不用管变更集ID)的需求,我给你整理几个经过实战验证的可行方案:
方案1:用TFS自带的迁移工具(首选,最省心)
TFS2017 Update3本身就集成了TFVC跨项目集的迁移功能,能自动帮你处理历史重放,步骤很清晰:
- 先在目标项目集建好空的TFVC团队项目,提前规划好路径结构(比如要迁移
$/SourceCollection/ProjA/ModuleX,就给目标项目建$/TargetCollection/NewProj/ModuleX的空文件夹) - 打开团队资源管理器,连接到源项目集,找到要迁移的TFVC路径,右键选「迁移」(嫌图形化慢也可以用命令行
tf migrate,不过向导更直观) - 在迁移向导里选好目标项目集和项目,然后设置迁移范围:可以选整个分支/文件夹,也能指定从某个变更集到最新的历史区间
- 关键设置:在「历史选项」里,取消勾选「保留变更集ID」,同时确保勾选「保留注释、变更者、变更时间和变更内容」
- 启动迁移就行,工具会逐变更集重放操作,自动处理权限关联,完成后去目标项目核对下历史记录是否完整
方案2:命令行手动迁移(适合自定义需求)
如果自带工具满足不了你的特殊需求(比如只迁移某几段历史),可以用TF命令行手动操作:
- 本地建两个工作区:一个映射源项目的目标路径,另一个映射目标项目的对应空路径
- 先把源路径的全量历史拉到本地:
tf get $/SourceCollection/ProjA/ModuleX /version:T /recursive(/version:T表示获取所有版本) - 导出历史记录到文件方便后续参考:
tf history $/SourceCollection/ProjA/ModuleX /recursive /format:detailed /noprompt > history.log,这个文件里包含了所有变更的注释、操作人、时间和变更内容 - 从最早的变更集开始逐次重放:在源工作区获取对应版本的文件,复制到目标工作区,用
tf add/tf edit/tf delete对应操作,提交时手动填入从日志里提取的信息,还能通过命令行参数指定原操作人和时间:tf checkin /comment:"原注释内容 - 原操作人:张三 原时间:2023-10-01 14:30" /author:"张三" /date:"2023-10-01" - 这个方法虽然繁琐,但能完全掌控每一步,适合小范围、有特殊筛选需求的迁移
方案3:第三方工具辅助(可选,适合大规模迁移)
如果要迁移的代码量很大,或者有很多复杂分支,可以试试第三方迁移工具,比如OpsHub的TFVC迁移工具——注意要选和TFS2017 Update3兼容的版本。这类工具能自动处理历史重放、分支关联,不需要手动逐变更集操作,也能完整保留你需要的所有历史信息,不过需要额外安装配置,适合企业级的大规模迁移
额外注意事项
- 迁移前一定要备份源项目集和目标项目集的数据库!万一出问题能及时回滚
- 确保迁移用的账号在源项目有读取权限,在目标项目有完全控制权限,避免中途权限报错
- 迁移完成后一定要验证:核对文件内容和源是否一致,历史记录里的注释、操作人、时间是否正确,变更内容(新增/修改/删除的文件)是否匹配
- 既然你是准备迁移到VSTS(现在叫Azure DevOps Services),这次跨项目集迁移可以作为过渡,之后从TFS2017迁移到Azure DevOps时,也能用类似的工具直接迁移,先完成内部迁移会更稳妥
内容的提问来源于stack exchange,提问作者Michael Cressey
相关产品推荐
相关产品推荐

