跳转到内容

从 Pivotal Tracker、Jira 及其他 tracker 迁移

正从 Pivotal Tracker、Jira、Linear、Asana、Trello、Shortcut、GitLab、Plane 或 GitHub 迁到 East Agile Tracker?先用试运行预览导入你的导出文件——每个来源会带过来什么,又会留下什么。

East Agile Tracker 可以从十一个来源导入。其中十个读取另一款工具本来就会生成的导出文件;GitHub 则直接连接到仓库。每个来源都走同一个界面和同一次预览,所以下面的步骤对它们全都适用。之后的各节列出每个来源会带过来什么。

  1. 从另一款工具导出你的工作——下面对应你来源的那一节写明了菜单。
  2. 在你想放入这些故事的项目上打开 Project Settings → Import / Export。如果需要,先创建一个空项目。
  3. 选择来源并指定导出文件。
  4. 运行试运行预览。它会解析整个文件,并报告一次真实导入会做什么——多少个故事和标签、跳过了多少行,以及任何无法匹配到成员的人——然后什么都不写入。
  5. 导入。

Import / Export 标签页,来源选为 Jira 并已选择导出文件,可预览或导入

预览报告:将导入 8 个故事和 3 个标签,没有跳过任何行,有一人无法匹配

重新导入同一个文件是安全的。已经导入过的行会按其来源 id 匹配并被跳过,所以第二次运行是给项目补齐,而不是把它复制一遍。

一次上传上限为 10 MiB,单次导入上限为 5,000 个故事。更大的迁移要拆成若干批,而由于重新导入是幂等的,这些批次可以互相重叠而不会产生重复。

  • 故事、状态和标签。 每一行或每张卡片会变成一个故事,它的状态会落在 unstarted → started → finished → delivered → accepted 环路上最接近的状态,标签也随之带过来。已取消或 won’t-fix 的状态会以 rejected 并已归档的形式到达,这样被放弃的工作就不会出现在看板上,也不会计入速率。
  • 负责人。 单元格里装着能匹配到某位成员的邮箱时,会挂上那位成员。其他任何值——显示名、用户名——会挂上一个仅供显示的外部人员,这样即使对方在这里没有账号,谁曾负责什么也会保留下来。
  • 日期。 创建日期和完成日期会被导入,这样历史迭代以及读取它们的图表就有数据,而不是一片空白。
  • 迭代,适用于导出中带有 sprint 或周期的每一个来源。

请求者、评论、史诗和任务取决于来源;下面它对应的那一节会写明哪些会带过来。

  • 附件。 没有任何导入器会搬运文件。故事到达时不带附件。
  • 作为账号的人。 一位尚不是成员的负责人、请求者或评论者,会作为仅供显示的外部人员挂上去。没有东西被丢掉,也没有东西被错误署名,但不会创建账号,也不会发出邀请——照常邀请他们,他们的历史就已经挂在那里了。
  • 最后修改日期。 进来的路上没有 updated 时间戳。
  • 工作流的细微差别。 自定义状态会收拢到上面那条环路中最接近的状态上。在导入一个大项目之前,可以在试运行预览里检查一个样本。

来源:Pivotal Tracker (CSV export)。Pivotal Tracker 已于 2025年4月30日 关停,所以再也没有一个在线服务可以导出了;这个导入器读取的是关停之前留下的 CSV 导出。看板、故事状态和验收环路遵循同一个模型,因此一个导入进来的项目读起来和以前一样。

Pivotal Tracker映射为
Title、Description故事的标题和描述。URL 列会作为故事的来源出处保留,而一段有文字的描述还会追加一个 View original issue 链接。
Type故事类型——feature、bug、chore 和 release 都有直接对应。
Current State故事的状态。
Estimate故事的点数估算。
Labels标签,每个值一个。
Owned By故事的负责人。Pivotal 会为每位负责人重复这一列,而每一列都会被读取。
Requested By故事的请求者。
Comment(每条评论一列)故事的评论,带上原作者和原始时间戳。
Task / Task Status故事上的任务,已完成的任务进来时就是已完成。
Blocker / Blocker Status阻碍,已解决的进来时就是已解决。
Type=epic 的行真正的史诗,会被重建并与引用它们的故事连接起来,史诗的描述也会一并带过来。
Iteration、Iteration Start迭代网格。来自一个尚未开始的迭代的故事会留在 Backlog 中,按 sprint 排序。
Created at、Accepted at故事的创建日期和完成日期。
Deadline一个 release 故事的计划日期。

一份 Pivotal 导出没有开工时间列,因此对导入的故事来说,周期时间的数字会保持为空。史诗是通过它的成员故事重建的,所以一行没有任何故事引用的史诗不会生成任何东西。

来源:Jira (CSV export)。在 Jira 中搜索你想要的议题,然后使用 Export → Export Excel CSV (all fields)。要取的是 all fields 这种导出——current fields 的导出会省掉 sprint、故事点和评论这几列。

Jira映射为
Summary故事的标题。summary 为空的行不会被导入。
Description故事的描述,从 Jira 的 wiki 标记转换为 markdown。标题、加粗、代码块、列表和链接会被转换;其他任何东西都保留为纯字面文本。
Issue Type故事类型——Bug 变成一个 bug,Story 和 Feature 变成 feature,而**Task 变成一个 chore**。
Status故事的状态。
Priority故事的优先级,从 Highest 一直到 Lowest。
故事点自定义字段故事的估算。会使用表头中提到故事点的第一列,因此 Custom field (Story Points) 和 Custom field (Story point estimate) 都可以。
Labels标签,每个值一个。
Fix Version/s每个值一个 Release: <version> 标签。
Sprint迭代网格。Jira 会为一个议题经过的每个 sprint 重复这一列,而最后一个就是它最终所在的地方;一个具名的 sprint 还会作为 Sprint: <name> 标签保留下来。
Assignee故事的负责人,作为一个仅供显示的外部人员——一份 Jira CSV 不带可用来匹配成员的邮箱地址。
Reporter故事的请求者,按同一条规则处理。
Comment(每条评论一列)故事的评论,每条都带着它原本的作者和时间戳。
Sub-task 议题父故事上的任务,已完成的子任务进来时就是已完成。父项在文件中缺失的子任务会变成一个自己的故事。
Epic 议题一个以该史诗命名的标签,会被打到它里面的每一个子议题上。
Issue key作为纯文本追加到描述末尾(Original issue: PROJ-12)。
Created、Resolved故事的创建日期和完成日期。

一个 Jira 史诗会以打在它子项上的标签的形式到达,而不是一条史诗记录:分组关系保留下来并且可以搜索,史诗自身的描述则不会。Jira 导出的是 sprint 的名称而不是它们的日期,所以迭代按 sprint 名称排序。

来源:Linear (CSV export)——在 Linear 中,Workspace settings → Import/Export → Export CSV。

  • Assignee 变成负责人,Creator 变成请求者。
  • Project 变成故事的史诗。
  • 子议题变成父故事上的任务。
  • 周期构成迭代网格;一个尚未开始的周期会把它的故事留在 Backlog 中,按周期排序。
  • Started 列会被读取,因此导入的故事也能计算周期时间。
  • Linear 的 CSV 没有类型列:打了 Bug 标签的故事会作为 bug 到达,否则作为 feature。
  • Linear 的 CSV 导出没有评论,已归档的议题会被跳过。

来源:Asana (CSV export)——在 Asana 中,Project menu → Export/Print → CSV。

  • Assignee 变成负责人,如果有 Assignee Email,就通过它匹配到成员。
  • 标记(tag)变成标签。
  • 子任务变成父故事上的任务。
  • 带有 Completed At 日期的任务会以 accepted 到达。
  • Asana 的 CSV 没有创建者列,也没有评论,因此执行导入的成员就是请求者。

来源:Trello (JSON export)——在 Trello 中,Menu → Print and export → Export as JSON。

  • 每张卡片变成一个故事,它所在的列表决定它的状态(To Do、Doing、Done 以及类似名称)。
  • 卡片上的成员变成负责人。
  • 评论会带着作者和时间戳过来。
  • 清单项变成任务。
  • 标签保留它们的名称和颜色;一个有颜色但没有名称的标签会以 Trello-<colour> 到达。
  • 已归档的卡片会以已归档的形式到达。
  • 打了 Bug 标签的卡片会作为 bug 到达。Trello 没有史诗也没有估算,所以两者都不会创建。

来源:Shortcut (CSV export)——在 Shortcut 中,Settings → Import/Export → Export to CSV。

  • owners 变成负责人,requester 变成请求者。
  • epic 变成故事的史诗。
  • tasks 变成故事上的任务;CSV 不记录完成标记,所以它们以未完成的状态到达。
  • 迭代构成迭代网格。
  • started_at 列会被读取,因此导入的故事也能计算周期时间。
  • 已归档的故事会以已归档的形式到达。Shortcut 的 CSV 没有评论。

来源:GitLab (CSV export)——在 GitLab 中,打开议题列表并使用 Export as CSV;GitLab 会把文件通过邮件发给你。

  • 打开的议题以 unstarted 到达,已关闭的以 accepted 到达。
  • Weight 变成估算。
  • 指派人变成负责人,作者变成请求者。
  • 议题的 URL 会作为它的来源出处保留。
  • 打开 Include milestones 可以让每个里程碑变成一个史诗;关闭时,里程碑列会被忽略。
  • GitLab 的议题 CSV 没有评论。

来源:Plane (CSV export) 或 Plane (JSON export)——在 Plane 中,Workspace settings → Exports。

  • 每一位指派人都会变成负责人。
  • 评论会带着作者和时间戳过来。
  • Plane 的状态组决定状态;已取消的议题会以 rejected 并已归档的形式到达。
  • 一个周期构成迭代网格,同时也作为 Cycle: <name> 标签保留下来;一个模块会变成 Module: <name> 标签。
  • Plane 的导出没有创建者列,因此执行导入的成员就是请求者。Plane 不导出开工日期,所以没有周期时间。

来源:GitHub (Issues via API)。输入所有者和仓库,而不是上传文件。issue 会带着它们的指派人、作者、标签、评论和清单项变成故事;拉取请求、里程碑(作为史诗)和发布是可选启用的。令牌、速率限制以及其余内容见 从 GitHub 仓库填充项目。

来源:East Agile Tracker (native export)——在另一个项目上,Settings → Import / Export → 下载导出。这是无损的路径:关注者、评审者、史诗、任务、阻碍、链接和 Icebox 全都会回来,负责人会按邮箱重新挂到成员上。

这些故事就是普通的故事——状态机、迭代和速率全都适用。同一个界面之后也能把这个项目再导出一次,导成 East Agile Tracker 格式作为无损副本,或者导成任何其他工具的形状;见 使用说明 → 导出项目。

创建一个项目并导入你的导出文件——导入器就在每个项目的设置界面上。