如何在Azure DevOps中通过API复制工作项树?是否有其他方法?
在Azure DevOps中复制完整工作项树的方法
一、无需API的手动/内置功能方法
1. 利用自带的工作项复制功能
- 打开要复制的父工作项(比如功能项),点击页面顶部的复制按钮
- 在弹出的复制对话框中,勾选复制子项选项,该选项会自动包含所有层级的子项、子子项
- 按需调整复制后的工作项字段:比如修改标题、状态、指派对象等,确认后点击创建即可生成完整的工作项树
- 注意:部分系统字段(如创建日期、原ID)不会被复制,自定义字段会默认继承原项的值,可手动修改
2. Excel批量导出导入(适合复杂批量场景)
- 在Azure DevOps的工作项查询中,创建包含目标工作项树所有节点的查询,确保结果包含父ID字段
- 点击查询结果页面的导出到Excel,将工作项数据导出到本地Excel文件
- 在Excel中修改所有工作项的标题、状态等需要调整的字段,删除原ID、创建日期等系统字段
- 回到Azure DevOps,点击导入工作项,选择修改后的Excel文件,导入时注意映射父ID字段:可先导入父项,待生成新ID后,再导入子项并更新父ID为对应新节点的ID
二、通过API实现复制
1. 核心步骤
(1)获取完整工作项树结构
调用Work Items - Get Work Item API,请求URL格式:
GET https://dev.azure.com/{organization}/{project}/_apis/wit/workitems/{id}?$expand=relations&api-version=7.1-preview.3
- 替换
{organization}、{project}、{id}为实际值 - 通过返回的
relations字段获取所有子项链接,递归遍历所有关联节点,记录每个节点的字段值和层级关系
(2)创建父工作项
调用Work Items - Create API,请求URL格式:
POST https://dev.azure.com/{organization}/{project}/_apis/wit/workitems/${workItemType}?api-version=7.1-preview.3
- 请求头设置
Content-Type: application/json-patch+json - 请求体用JSON Patch格式,复制原父项的字段值(排除
System.Id、System.CreatedDate等不可修改的系统字段) - 示例请求体:
[ { "op": "add", "path": "/fields/System.Title", "value": "复制的功能项标题" }, { "op": "add", "path": "/fields/System.Description", "value": "原功能项的描述内容" } ]
- 保存返回的新父项ID,用于后续子项关联
(3)递归创建子项及子子项
针对每个子项,调用同样的Work Items - Create API,在请求体中添加System.Parent字段,值为对应父项的新ID:
[ { "op": "add", "path": "/fields/System.Title", "value": "复制的用户故事标题" }, { "op": "add", "path": "/fields/System.Parent", "value": "<新父项ID>" } ]
- 递归处理所有层级的子项,确保每个子项的
System.Parent指向正确的新父节点
(4)权限与认证
- 使用个人访问令牌(PAT)认证,请求头添加:
Authorization: Basic <base64编码的PAT>(PAT需要拥有**Work Items (Write)**权限)
2. 优化建议
- 对于大量工作项,使用
Work Items - Create BatchAPI批量创建,减少请求次数,提高效率 - 处理字段映射时,提前过滤不可修改的系统字段,避免API报错
内容的提问来源于stack exchange,提问作者Dav
相关产品推荐
相关产品推荐

