2. 数据版本控制入门
任务目标
使用DVC(Data Version Control)对本地数据集目录进行版本管理,实现数据文件的追踪(dvc add)、提交(git commit)以及历史版本切换(dvc checkout)。本案例以MNIST数据集的子集模拟真实场景,完成从初始化到版本回滚的完整闭环。
环境与依赖
- Python 3.8+,已安装
dvc(pip install dvc)与git - 操作系统:Linux/macOS/WSL(Windows原生需额外配置)
- 无需远程存储,本案例使用本地目录作为DVC缓存
实现步骤与代码
以下命令在项目根目录按顺序执行。核心逻辑为:用DVC接管数据目录,通过Git记录DVC元数据文件(.dvc文件),利用DVC缓存实现版本切换。
# 1. 初始化项目与DVC
mkdir dvc-demo && cd dvc-demo
git init
dvc init
# 创建模拟数据集(v1.0:100个文件)
mkdir -p data/images
for i in $(seq -w 1 100); do echo "img-$i" > data/images/$i.txt; done
# 2. 追踪数据目录(生成 data/images.dvc 元数据文件)
dvc add data/images
# 3. 提交第一个版本
git add data/images.dvc .gitignore
git commit -m "dataset v1.0: 100 samples"
# 4. 模拟数据更新(v2.0:新增50个文件)
for i in $(seq -w 101 150); do echo "img-$i" > data/images/$i.txt; done
dvc add data/images
git add data/images.dvc
git commit -m "dataset v2.0: 150 samples"
# 5. 版本切换演示:回退到v1.0
git checkout HEAD~1 -- data/images.dvc
dvc checkout
# 验证:此时 data/images 目录应恢复为100个文件
ls data/images | wc -l # 预期输出:100
# 6. 切回最新版本
git checkout main -- data/images.dvc
dvc checkout
ls data/images | wc -l # 预期输出:150
关键机制说明
dvc add将数据文件复制到DVC缓存(默认.dvc/cache),并在工作区生成.dvc元数据文件(记录文件哈希),原始数据目录被替换为缓存链接。- Git只追踪
.dvc文件和.gitignore(自动添加数据目录),不直接存储大文件。 - 版本切换时,先通过
git checkout切换.dvc文件到目标版本,再执行dvc checkout让DVC根据元数据哈希从缓存恢复对应数据文件。
验证方法与通过标准
- 版本追踪验证:执行
dvc status,输出应显示Data and pipelines are up to date.,表示当前数据与Git记录一致。 - 版本切换验证:完成第5步后,
ls data/images | wc -l输出必须为100;完成第6步后输出必须为150。若数值不符,说明缓存或元数据未正确切换。 - 缓存完整性验证:执行
dvc cache dir确认缓存路径存在,且find .dvc/cache -type f | wc -l输出为2(两个版本各对应一个哈希文件目录)。
常见问题
- 切换后文件丢失:若
dvc checkout报错file not found,先执行dvc pull(本地缓存场景下会自动从.dvc/cache恢复),再检查git status确认.dvc文件已正确切换。 - 缓存占用过大:DVC默认保留所有历史版本缓存,如需清理可执行
dvc gc(会删除未被当前工作区引用的缓存文件,谨慎使用)。