在 GitHub 上编辑

init

在指定目录中初始化一个 DVC 项目。默认为当前工作目录。

概要

usage: dvc init [-h] [-q | -v] [--no-scm] [-f] [--subdir] [directory]

描述

DVC 在 Git 仓库中效果最佳。这能启用所有功能,提供最大价值。因此,dvc init(不带参数)期望在 Git 仓库根目录下运行(即应存在 .git/ 目录)。

在 DVC 初始化时,会创建一个新的 .dvc/ 目录,用于存放配置、默认的缓存位置以及其他内部文件和目录,这些内容对用户是隐藏的。该目录会自动通过 git add 添加到暂存区,因此可以轻松地使用 Git 提交。

命令的选项可用于启动适用于高级场景的替代工作流:

默认情况下,该命令会在当前工作目录中初始化仓库。如果指定了 <directory>,则会在该位置初始化仓库。如果该目录不存在,则会自动创建。

在子目录中初始化 DVC

必须提供 --subdir 才能在 Git 仓库的子目录中初始化 DVC。DVC 仍然期望找到一个 Git 根目录(将向上遍历所有目录直至系统根目录来查找 .git/)。此选项不会影响任何配置文件,.dvc/ 目录的创建方式与默认模式相同。这样可以在单个 Git 仓库中初始化多个DVC 项目,实现项目之间的隔离。

这在单体仓库(monorepo,即将 Git 仓库划分为多个项目目录)场景中最实用,但在其他需要此类隔离的结构中也可使用。dvc init --subdir 可缓解在 Git 仓库根目录初始化 DVC 时可能遇到的一些限制:

  • 仓库维护者可能不允许在顶层添加 .dvc/ 目录,特别是当已有多个子项目在使用 DVC 时(如 monorepo 场景)。

  • DVC 的内部机制(配置、缓存目录、远程存储等)将在不同子目录之间共享。

  • 默认情况下,像 dvc pulldvc repro 这样的 DVC 命令会扫描整个DVC 仓库,以查找被 DVC 跟踪的数据和管道进行操作。这对于大型单体仓库来说可能效率低下。

  • dvc statusdvc metrics show 这样的命令,如果不局限于单一项目范围,可能会产生意外结果。

DVC 会从当前工作目录开始向上查找 .dvc/ 来确定项目根目录。使用 --subdir 时,项目根目录会在到达 Git 根目录之前就被找到。

这定义了大多数 DVC 命令(例如 dvc reprodvc pulldvc metrics diff 等)的作用范围。它们只能访问子目录项目内的 dvc.yaml.dvc 文件等。

如果有多个 --subdir 项目但不嵌套,例如:

.           # git init
├── .git
├── project-A
│   ├── .dvc    # dvc init --subdir
│   ...
├── project-B
│   ├── .dvc    # dvc init --subdir
│   ...

DVC 将 A 和 B 视为独立的项目。在 project-A 中运行的任何 DVC 命令都无法感知到 project-B。然而,涉及版本控制的命令(如 dvc diff 等)会从 Git 根目录(.)访问提交历史。

在这种情况下,. 不是一个 DVC 项目,因此大多数 DVC 命令无法在此处运行。

如果存在嵌套的 --subdir 项目,例如:

project-A
├── .dvc        # git init && dvc init
├── .git
├── dvc.yaml
├── ...
├── project-B
│   ├── .dvc        # dvc init --subdir
│   ├── data-B.dvc
│   ...

对内部项目而言没有任何变化。而在外部项目中运行的任何 DVC 命令都会主动忽略嵌套的项目目录。例如,在 project-A 中使用 dvc pull 不会下载 data-B.dvc 文件对应的数据。

不使用 Git 初始化 DVC

在极少数情况下,可能需要使用 --no-scm 选项:在不属于 Git 仓库的目录中初始化 DVC,或让 DVC 忽略 Git。示例包括:

  • 使用非 Git 的 SCM 工具。尽管某些 DVC 功能要求在 Git 仓库中运行 DVC,但 DVC 可以很好地与其他版本控制系统协同工作。由于 DVC 依赖简单的 dvc.yaml 文件来管理 流水线、数据等,这些文件可以被添加到任意版本控制系统中,从而实现对大型数据文件和目录的版本控制。

  • 完全不需要保留历史记录,例如使用类似 cron 的方式运行数据流水线进行部署自动化。

在此模式下,与版本控制相关的 DVC 功能不可用。例如在 dvc adddvc stage add 时自动创建和更新 .gitignore 文件,以及需要 Git 版本对比的 dvc diffdvc metrics diff

以这种方式初始化时,DVC 会在 DVC 配置 中将 core.no_scm 配置项设置为 true。这意味着即使项目被 Git 跟踪,或之后在其中初始化 Git,DVC 在该项目中仍会保持与 Git 脱离的状态运行。

选项

  • -f, --force - 初始化前如果存在 .dvc/ 则将其删除。这将移除任何现有的本地缓存。当之前的 dvc init 已损坏时非常有用。

  • --subdir - 在指定的工作目录中初始化 DVC 项目,即使它不是 Git 仓库的根目录。(如果在项目根目录运行,此选项将被忽略。)它会影响后续其他 DVC 命令的行为,详见 在子目录中初始化 DVC

  • --no-scm - 使 DVC 项目脱离 Git 进行初始化。这意味着 DVC 不会尝试查找或使用该目录中的 Git。此模式下某些 DVC 功能不可用。详见 不使用 Git 初始化 DVC

  • -h, --help - 打印使用说明/帮助信息,然后退出。

  • -q, --quiet - 不向标准输出写入任何内容。如果没有问题则以 0 退出,否则以 1 退出。

  • -v, --verbose - 显示详细的跟踪信息。

示例:最常见的初始化流程

创建一个新的DVC 仓库(需在 Git 仓库根目录下运行):

$ mkdir mydvcrepo && cd mydvcrepo
$ git init
$ dvc init
$ git status
...
        new file:   .dvc/.gitignore
        new file:   .dvc/config

$ git commit -m "Init DVC"

请注意,缓存目录(以及其他一些目录)不会被 Git 跟踪。它包含数据和模型文件,将由 DVC 进行管理。

$ cat .dvc/.gitignore
/config.local
/tmp
/cache

示例:在子目录中初始化 DVC

在 Git 仓库的子目录中创建一个DVC 仓库

$ mkdir mygitrepo && cd mygitrepo
$ git init

$ mkdir project-a && cd project-a
$ dvc init --subdir

在这种情况下,Git 仓库位于 repo 目录中,而DVC 仓库位于 repo/project-a 中。

$ tree repo -a
repo
├── .git
.
.
.
└── project-a
    └── .dvc
内容

🐛 发现问题?告诉我们!或者修复它:

在 GitHub 上编辑

有疑问?加入我们的聊天,我们会为您提供帮助:

Discord 聊天