.dvcignore
文件标记在遍历 DVC 项目时应排除哪些文件和目录。有时您可能希望 DVC 在处理项目时忽略某些文件。
例如,在工作区目录中处理大量数据文件时,对于dvc status
这样简单的操作,您可能会遇到执行时间延长的问题。 在其他情况下,您可能希望省略与项目无关的文件或文件夹(如:macOS 上的 .DS_Store
)。 为了解决这些情况,DVC 支持 .dvcignore
文件(可选的)。
.dvcignore
类似于 Git 中的 .gitignore
,可以使用我们的辅助命令 dvc check-ignore
进行测试。
.dvcignore
文件是如何工作的?
- 您需要创建一个
.dvcignore
文件。这些可以放在项目的根目录中,也可以放在任何子目录中。 - 用
.gitignore
范例格式 来填充它。您可以在此处找到有用的模板。 - 每行应该只包含一个样式。
- 在执行遍历目录的命令期间,DVC 将会忽略匹配到的路径。
注意事项
- 忽略的文件不会保存在缓存中,它们对于 DVC 将不存在。值得记住这一点,尤其是在忽略 DVC 处理的目录中的文件时。
dvc run
和dvc repro
可能会删除被忽略的文件。 如果它们不是由流水线 Stage 产生的,它们可能会永久丢失。- 当您添加的
.dvcignore
模式影响现有输出时,其状态将发生变化,并且 DVC 的行为就像删除了受影响的文件一样。 - 您可以使用
dvc check-ignore
命令检查给定的文件或目录是否被.dvcignore
文件中的模式忽略。 - 如果 DVC 在依赖或输出目录中找到
.dvcignore
文件,则会引发错误。 忽略此类目录中的文件应从项目树更高级别的 .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 .dvc/cache ├── 26 │ └── ab0db90d72e28ad0ba1e22ee510510 └── ad └── 8b0ddcf133a6e5833002ce28f97c5a.dir $ md5 data/* b026324c6904b2a9cb4b88d6d61c81d1 data/data1 26ab0db90d72e28ad0ba1e22ee510510 data/data2 复制代码
只存储了data/
目录本身的缓存条目和一个文件。 手动检查数据文件的哈希值,我们可以看到data2
被缓存了。 这意味着 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
。
对跟踪文件的修改会产生不同的输出,具体如下:
$ 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 复制代码
如果我们移动,并对忽略的数据不予理睬,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.dvc
和 data1
。