在 GitHub 上编辑

.dvcignore 文件

标记在遍历 DVC 项目 时应排除的文件和/或目录。

有时,在处理项目时,你可能希望 DVC 忽略某些文件。例如,当你在一个包含大量数据文件的 工作区 目录中工作时,即使是像 dvc status 这样简单的操作,也可能出现执行时间过长的情况。另一种情况是,你可能想忽略与项目无关的文件或文件夹(例如 macOS 上的 .DS_Store)。为应对这些场景,DVC 支持可选的 .dvcignore 文件。

.dvcignore 类似于 Git 中的 .gitignore,并可通过我们的辅助命令 dvc check-ignore 进行测试。

它是如何工作的?

  • 你需要创建一个 .dvcignore 文件。它可以放在项目根目录,也可以放在任意子目录中(参见下方的 说明)。
  • 在文件中填入 .gitignore 模式。你可以从 这里 找到有用的模板。
  • 每行只能包含一个模式。
  • 在执行需要遍历目录的命令时,DVC 将忽略匹配的路径。

说明

被忽略的文件不会被保存到 缓存 中,对 DVC 来说它们如同不存在。这一点尤其需要注意,特别是当你在 DVC 管理的目录内部忽略文件时。

dvc exp rundvc repro 可能会删除被忽略的文件。如果这些文件不是由某个流水线 阶段 生成的,则可能会永久丢失。

请注意,当你添加影响现有 输出.dvcignore 模式时,其状态会发生变化,DVC 会认为受影响的文件已被删除。

💡 提示:你可以使用 dvc check-ignore 命令来检查指定的文件或目录是否被 .dvcignore 文件中的模式所忽略。

如果 DVC 在依赖项或输出目录中发现 .dvcignore 文件,将会报错。此类目录内的文件忽略应通过项目树更高层级的 .dvcignore 文件来处理。

示例

让我们看看将文件添加到 .dvcignore 后会发生什么:

$ mkdir data
$ echo 1 > data/data1
$ echo 2 > data/data2
$ tree
.
└── data
    ├── data1
    └── data2

我们创建了包含两个数据文件的 data/ 目录。现在忽略其中一个文件,并确认 DVC 确实忽略了它:

$ echo data/data1 >> .dvcignore
$ cat .dvcignore
data/data1
$ dvc check-ignore data/*
data/data1

有关该命令的更多细节,请参考 dvc check-ignore

示例:添加目录时跳过特定文件

现在我们使用 dvc add 跟踪该目录,并查看 缓存 中发生了什么:

$ dvc add data
...
$ tree .dvc/cache/files/md5
.dvc/cache/files/md5
├── 26
│   └── ab0db90d72e28ad0ba1e22ee510510
└── ad
    └── 8b0ddcf133a6e5833002ce28f97c5a.dir
$ md5 data/*
b026324c6904b2a9cb4b88d6d61c81d1  data/data1
26ab0db90d72e28ad0ba1e22ee510510  data/data2

只有两个缓存条目,其中一个(以 ad 开头并以 .dir 结尾)是用于 data/ 目录本身的。通过手动检查数据文件的哈希值,我们可以看到另一个缓存条目(以 26 开头)是用于 data2 的。data1 文件(其哈希值以 ab 开头)没有对应的缓存条目。这意味着 dvc add 确实忽略了 data1

更多信息请参见 缓存目录的结构

示例:忽略文件状态变化

现在,让我们修改文件 data1,并查看是否会影响 dvc status

$ dvc status
Data and pipelines are up to date.

$ echo "2345" >> data/data1
$ dvc status
Data and pipelines are up to date.

dvc status 忽略了 data1

同样地,删除一个被 DVC 忽略的文件也不会影响 dvc status

$ rm data/data1
$ dvc status
Data and pipelines are up to date.

对已跟踪文件进行修改或删除会产生不同的输出:

$ echo "345" >> data/data2
$ dvc status
data.dvc:
	changed outs:
		modified:           data

示例:移动被忽略的数据

$ mkdir data
$ echo data1 >> data/data1
$ echo data2 >> data/data2
$ tree .

.
└── data
    ├── data1
    └── data2

$ echo data/data1 >> .dvcignore
$ cat .dvcignore

data/data1

$ dvc add data

如果我们把被忽略的文件移动到 data 目录内的一个新文件(该目录未被 dvc 忽略),DVC 会表现得好像我们在这个目录中添加了一个新文件:

$ dvc status
Data and pipelines are up to date.

$ mv data/data1 data/data3
$ dvc status
data.dvc:
	changed outs:
		modified:           data

示例:忽略 DVC 跟踪的文件

让我们分析一个示例 工作区

$ mkdir dir1 dir2
$ echo data1 >> dir1/data1
$ echo data2 >> dir2/data2
$ dvc add dir1/data1 dir2/data2
$ tree .
.
├── dir1
│   ├── data1
│   └── data1.dvc
└── dir2
    ├── data2
    └── data2.dvc

修改数据文件:

$ echo mod > dir1/data1
$ echo mod > dir2/data2

检查状态:

$ dvc status
dir1/data1.dvc:
	changed outs:
		modified:           dir1/data1
dir2/data2.dvc:
	changed outs:
		modified:           dir2/data2

注意,两个数据文件都显示为已修改。创建一个 .dvcignore 文件,并插入匹配其中一个文件的模式:

$ echo 'dir1/*' >> .dvcignore

再次检查状态:

$ dvc status
dir2/data2.dvc:
	changed outs:
		modified:           dir2/data2

此时仅显示第二个文件,因为 DVC 现在忽略了 data1.dvcdir1