---
url: /zh/workspaces/file-keeper.md
---
云原生开发环境采用按需使用，闲置自动销毁策略

为了避免开发环境销毁后未提交代码和配置文件丢失，云原生开发采用以下代码备份和文件漫游策略：

## 工作区代码备份

无需担心环境销毁后工作区未提交代码丢失。云原生开发采用如下两种备份方式，确保代码不丢失。

:::tip
对于团队开发，建议创建个人分支进行开发。一个分支仅由一个人开发，这样可以减少恢复代码导致的冲突。
:::

### 开发环境销毁时备份

在当前工作区目录 `/workspaces` 修改代码后，如果未及时提交，无需担心修改记录丢失，环境回收时，会将修改的代码备份。
重建开发环境后，未提交的代码会恢复到工作区。

#### 1. 备份和恢复方式

* 开发环境销毁时备份: 将未提交代码打包成压缩包上传保存。

注意：对于同一个用户，这种备份方式，每个分支仅会保留一份备份，即覆盖性备份。如果一个分支同时启动了两个云原生开发环境，后销毁的环境备份会覆盖先销毁的环境备份。

* 开发环境重建时恢复: 将备份压缩包下载下来，并原样恢复到工作区。

:::tip
即以下两种情况不会备份：

* 单个代码文件或单个 diff 文件内容大小超过 100MB 会被过滤掉，仅打包不超过 100MB 的文件
* 总的备份文件大小超过 100MB，不会被备份

大文件建议用 `.gitignore` 忽略
:::

#### 2. 备份内容

* 工作区的 stash
* 工作区未 push 的 commit
* 工作区未提交代码（包括工作区修改、暂存区修改、未追踪文件，不包括 `.gitignore` 忽略的文件）

#### 3. 备份代码删除时机

每个分支对应唯一一份备份：每个环境的备份会覆盖上一个环境的备份，每个分支仅保存最新一份备份。

#### 4. 恢复策略说明

重建或新建环境，均会漂移到最新代码，即默认用分支最新代码启动开发环境。
恢复时会恢复最新一份备份。如果在非云原生开发环境提交过代码，可能会发生冲突。此时可丢弃这部分恢复的代码。

:::tip
代码恢复后备份将被删除，即每次备份的代码仅可恢复一次。新的环境销毁时会产生新的备份代码。以下内容不会备份：

* `.gitignore` 文件中声明的内容不会被备份
* 子仓库中修改的内容不会备份
* 非工作区的修改不会备份

:::

### 定时备份策略

为了避免上述备份方式失败，云原生开发同时采用了定时备份策略，定时将未提交代码打包并上传。

* 备份：每 5 分钟获取一次工作区未提交代码，并生成压缩包上传。
* 下载：可在 `我的云原生开发` 列表页，下载备份代码压缩包。
* 删除：可在 `我的云原生开发` 列表页，删除开发环境历史记录时会删除该备份

:::tip

* 单个文件超过 100MB，该文件不会备份。
* 备份代码压缩包超过 100MB 也不会被备份。

:::

## 非工作区文件漫游

云原生开发支持部分非工作区目录下文件漫游。

在环境销毁后，再次创建开发环境，漫游的文件可恢复到开发环境中。

最大漫游容量：\_\_ENV\_\_VSCODE\_USER\_DATA\_SIZE MB，超过最大容量将报错且无法漫游。

### 漫游内容

以下文件或文件夹会按用户维度进行漫游，
对所有项目有效果(`~`: 当前用户的主目录，一般是 `/root` 目录)：

* `~/.gitconfig`: git 全局配置文件。特殊处理：若容器内已存在此文件（如使用了自定义环境已预置了该文件），则恢复和保存时均跳过，保留容器原有配置不变。推荐用户自定义环境时如需要可修改 `/etc/gitconfig`，避免和用户漫游配置文件冲突
* `~/.local/share/code-server/User/settings.json`：WebIDE 配置文件
* `~/.local/share/code-server/User/snippets/*`：WebIDE 相关配置
* `~/.local/share/code-server/User/keybindings.json`：WebIDE 快捷键配置
* `~/.cnb`: 用户可按需在该目录下新增个人环境所需配置文件。

关于 `~/.cnb` 目录的使用说明：

* 新增配置文件：如果仓库需要新增个人配置文件 `.env.local`，
  用于存储仓库所需的个人环境变量，可在 `~/.cnb` 目录下新增 `.env.local` 文件
* 在环境启动后可配置[脚本任务](../build/grammar.md#脚本任务)将 `~/.cnb/.env.local` 复制或软链到工作目录（默认为`/workspace`），
  `.cnb.yml` 配置如下
* 在 `.gitignore` 中新增忽略文件 `.env.local`，避免个人配置文件被提交到仓库

1、示例一，复制文件到工作目录：

要修改漫游的配置文件，需直接修改 `/root/.cnb/.env.local`

```yaml title=".cnb.yml"
$:
  vscode:
    - name: vscode
      services:
        - vscode
      stages:
        - name: 复制 .env.local 文件到工作目录（仓库根目录）
          # ./ 是工作目录，默认为 /workspace
          script: |
            if [ -e "/root/.cnb/.env.local" ]; then
                cp -f /root/.cnb/.env.local ./
            else
                echo "文件不存在"
            fi
```

2、示例二，软链文件到工作目录：

要修改漫游的配置文件，可修改工作目录的 `/workspace/.env.local`（软链方式会同步修改源文件）

```yaml title=".cnb.yml"
$:
  vscode:
    - name: vscode
      services:
        - vscode
      stages:
        - name: 软链 .env.local 文件到工作目录（仓库根目录）
          # ./ 是工作目录，默认为 /workspace
          script: |
            if [ -e "/root/.cnb/.env.local" ]; then
                ln -sf /root/.cnb/.env.local ./.env.local 
            else
                echo "文件不存在"
            fi
```

### 漫游原理和时机

**漫游时机：**

用户在开发环境修改配置（如 settings.json）后，不会立马漫游修改内容，
而是等到开发环境销毁时，再从开发环境中取出需漫游的文件进行持久化存储

**如何恢复漫游文件：**

重建开发环境时，会自动将漫游的文件恢复到开发环境中

**如何验证文件是否漫游成功：**

修改可漫游文件后如需验证修改效果，需等到开发环境销毁后，再创建/重建开发环境才能看到修改文件的漫游效果

:::tip
注意：

* 同时打开多个开发环境，后销毁的开发环境的漫游内容会覆盖先销毁的开发环境的漫游内容。
* 通过 `kill 1` 关闭开发环境，无法漫游成功。
* 如果需要漫游的文件是一个软链，我们将漫游软链的原始文件，而不是软链，目的是避免原始文件丢失。如果软链的原始文件不存在，则不进行漫游。

:::
