init
在指定目录中初始化一个 DVC 项目。默认为当前工作目录。
概要
描述
DVC 在 Git 仓库中效果最佳。这能启用所有功能,提供最大价值。因此,dvc init
(不带参数)期望在 Git 仓库根目录下运行(即应存在 .git/
目录)。
在 DVC 初始化时,会创建一个新的 .dvc/
目录,用于存放配置、默认的缓存位置以及其他内部文件和目录,这些内容对用户是隐藏的。该目录会自动通过 git add
添加到暂存区,因此可以轻松地使用 Git 提交。
命令的选项可用于启动适用于高级场景的替代工作流:
- 在子目录中初始化 DVC(
--subdir
)——适用于单体仓库(monorepo)和嵌套的DVC 项目 - 在没有 Git 的情况下初始化 DVC(
--no-scm
)——适用于非常简单的项目、非 Git 的版本控制系统、部署自动化等用途
默认情况下,该命令会在当前工作目录中初始化仓库。如果指定了 <directory>
,则会在该位置初始化仓库。如果该目录不存在,则会自动创建。
在子目录中初始化 DVC
必须提供 --subdir
才能在 Git 仓库的子目录中初始化 DVC。DVC 仍然期望找到一个 Git 根目录(将向上遍历所有目录直至系统根目录来查找 .git/
)。此选项不会影响任何配置文件,.dvc/
目录的创建方式与默认模式相同。这样可以在单个 Git 仓库中初始化多个DVC 项目,实现项目之间的隔离。
这在单体仓库(monorepo,即将 Git 仓库划分为多个项目目录)场景中最实用,但在其他需要此类隔离的结构中也可使用。dvc init --subdir
可缓解在 Git 仓库根目录初始化 DVC 时可能遇到的一些限制:
-
仓库维护者可能不允许在顶层添加
.dvc/
目录,特别是当已有多个子项目在使用 DVC 时(如 monorepo 场景)。 -
默认情况下,像
dvc pull
和dvc repro
这样的 DVC 命令会扫描整个DVC 仓库,以查找被 DVC 跟踪的数据和管道进行操作。这对于大型单体仓库来说可能效率低下。 -
像
dvc status
和dvc metrics show
这样的命令,如果不局限于单一项目范围,可能会产生意外结果。
DVC 会从当前工作目录开始向上查找 .dvc/
来确定项目根目录。使用 --subdir
时,项目根目录会在到达 Git 根目录之前就被找到。
这定义了大多数 DVC 命令(例如 dvc repro
、dvc pull
、dvc 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 add
或 dvc stage add
时自动创建和更新 .gitignore
文件,以及需要 Git 版本对比的 dvc diff
和 dvc 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