如何在DVC中增量添加文件时仅使用根目录.gitignore与根级DVC文件
可行方案
DVC默认逐目录生成.dvc和.gitignore的行为是默认配置,没有全局开关直接关闭,但可以通过以下两种官方支持的操作方式,完全实现「仅根目录生成DVC文件、统一维护根目录.gitignore、不改动原有数据集目录结构」的需求,所有DVC核心功能(缓存、版本回滚、push/pull、增量检入)都不受影响。
方案1:统一使用根目录单.dvc文件追踪所有数据(最接近原生dvc add的使用习惯)
dvc add自带-f/--file参数,可以手动指定.dvc元数据文件的生成路径,你可以把所有数据的追踪信息全部写入根目录的同一个.dvc文件中,避免子目录生成零散元文件:
- 清理之前默认生成的冗余文件:删除所有子目录下自动生成的
.dvc文件、子目录内的.gitignore文件,将被追踪的数据文件恢复为未被git忽略的状态。 - 第一次添加数据时,在项目根目录执行命令,指定元文件存到根目录,比如统一命名为
dataset.dvc:dvc add -f dataset.dvc bar/biz/boz - 后续增量添加其他路径的数据时,重复执行上述命令,替换成新的文件/目录路径即可,新的条目会自动追加到根目录的
dataset.dvc中,不会生成新的元文件:# 比如后续新增data/train、data/val两个目录 dvc add -f dataset.dvc data/train data/val - 忽略DVC弹出的「添加子目录.gitignore」的提示,手动把所有被DVC追踪的数据文件/目录路径,统一添加到项目根目录的
.gitignore中即可。 - 每次添加完新数据,执行
dvc commit dataset.dvc更新元文件的哈希值,后续提交git时只需要提交根目录的dataset.dvc和根目录.gitignore,和普通代码提交流程完全一致。
方案2:用根目录dvc.yaml统一管理数据追踪(适合后续可能加数据处理流水线的场景)
如果后续你有可能基于这套数据集做处理流水线,可以直接用DVC的stage定义能力,把所有数据追踪规则统一写到根目录的dvc.yaml中,子目录不会生成任何DVC相关文件:
- 同样先清理之前生成的子目录冗余
.dvc、.gitignore文件。 - 每次增量添加数据时,在根目录执行
dvc stage add命令,注册数据路径,不需要实际执行处理命令的话加--no-exec参数跳过执行即可:# 追踪bar/biz/boz文件,stage名可以自定义方便区分 dvc stage add -n track_boz -o bar/biz/boz --no-exec echo "track dataset file" - 所有追踪规则会自动写入根目录的
dvc.yaml,执行dvc commit更新哈希后,统一维护根目录.gitignore忽略所有大文件即可,后续更新数据只需要跑dvc repro就能同步所有元数据。
注意事项
- DVC弹出的子目录gitignore添加提示只是操作建议,不是强制要求,只要根目录
.gitignore规则正确拦截了大文件、避免git误提交,就不会影响任何功能。 - 如果之前已经用默认模式添加过大量数据,不需要重新追踪文件,只需要把所有子目录零散
.dvc文件里的outs字段下的路径,合并到根目录的统一.dvc文件或dvc.yaml中,删除子目录冗余文件后跑一次dvc commit校验哈希一致,就可以完成平滑迁移,不会丢失版本记录或缓存数据。 - 两种方案都不会改动你原有数据集的目录结构,数据文件始终保留在原位置,不需要做迁移或重组。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

