# 导入运行记录

> 把在另一套安装上记录的 .glab 文件收进这个归档，成为一条独立、可完整追溯的条目：验证什么、副本会得到什么，以及它永远得不到什么。

**导入**控件在运行记录列表的标题栏里，紧挨着刷新，它接受一个在另一套安装上记录的 `.glab` 文件（见[导出一次运行记录](histories-export#glab)）。这个控件只对具备**导出/导入历史**权限的角色画出来；别的角色看到的列表标题栏上没有它。它需要一台接受写入的工作站（“运行时已停止”），因为它要发布一个运行记录文件和一条索引行；这一条上还有别的动作在跑时它是灰的（“上一条命令还在执行。”）。

## 验证什么 {#what-is-validated}

文件先以流式写入一份临时副本（上传上限为 1 GB；操作记录条写着“正在导入 · 文件…”），并在那里先做验证。被拒绝时不会产生任何条目：

| 拒绝的说法 | 什么时候 |
| --- | --- |
| 选中的文件为空或读不出来。 | 上传的内容为空或无法读取。 |
| 选中的文件不是 Ganter Lab 的运行记录文件。 | 文件里没有运行记录文件的结构历史。 |
| 这个文件由更新的或不兼容的 Ganter Lab 版本创建，无法导入。 | 运行记录文件的格式来自更晚的版本或不兼容。 |
| 选中的文件不是可读的 Ganter Lab 运行记录文件。 | 不是 SQLite 数据库，或者数据库已损坏。 |

## 回执与发布出来的副本 {#the-receipt-and-the-published-copy}

来自受支持的较早基线的文件，只在临时副本上升级；收到的那个文件从不被改动。副本随后把自己的**导入回执**，也就是导入时刻和收到的文件名，盖进自己里面，因此这份档案永远说得出这次运行是从哪里来的，重建索引也能把已导入标记恢复回来；从另一台工作站再导出的副本带的是那台工作站的回执，而这份副本的来历就是它到这里来的这一次。工作站会以一个唯一的名字发布一份全新的本地副本（`Imported_<run name>_<id>.db`），并登记一条新的、独立的条目；操作记录条写着“已导入 · 名称 · 来自 文件（大小）”，列表随即定位到它。

## 副本会得到什么，永远得不到什么 {#what-the-copy-gets-and-never-gets}

- 导入进来的运行记录会拿到一个全新的本地标识；原来的运行记录 id 作为证据留在文件里，因此两套安装可以互相交换运行记录而不冲突。
- 它永远不会和本地配置挂钩，哪怕本地存在同名的流程：它不属于任何单元，它的流程为空，它无法继续，它永远不计入本地产量，它不为**新建标签**配置任何标签，而且“（流程自带的报告）”会用包含全部小节的默认版式来排它。
- 它的状态就是冻结在文件里的那个终态：被联锁结束的运行记录导入后是已中止，而冻结下来的非终态状态会被收拢为已完成。从来没有写下快照的文件（源工作站在运行中途死机）会以一条按文件命名的失败运行记录导入，这样它就不会丢。
- 什么都不会被覆盖或合并：同一个文件导入两次，得到两条互相独立的条目。
- 责任人作为冻结下来的证据随副本一起走。在用户名册相同的工作站上，冻结下来的身份仍然指向同一个操作员；在别处，它写出那个人的名字，但不与任何本地用户匹配。

## 使用导入进来的运行记录 {#using-the-imported-run}

导入之后，这条运行记录和别的一样可以浏览、写备注、加标注和再次导出，它的标签产物和报告登记也一并跟来：一件产物冻结下来的字节可以在这里重新打印，而一条登记所指的已发布 PDF 并不在这台工作站上，因此只有源工作站把副本保留在运行记录里时，它才能被打开或重发；否则就从文件重新生成一份 PDF。

## 如果应用在导入中途停止 {#if-the-app-stops-mid-import}

如果应用正好在发布文件和登记它之间那一小段时间里停止，文件不会丢：[设置](settings-backups)里的**重建运行历史索引**会重新扫描运行记录文件，它们才是准据，并把它的条目还回来。
