在 GitHub 上编辑
如何解决 DVC 元文件中的合并冲突
有时多个团队成员会同时处理相同的 DVC 跟踪数据。当需要合并他们的更改时,可能会在 Git 跟踪的 DVC 文件 中出现合并冲突,需要手动解决。
dvc.yaml
这类冲突与我们在源代码中遇到的没有区别。参见 Git 合并。
stages:
prepare:
cmd: python src/prepare.py data/data.xml
deps:
< < < < < < < HEAD
- data/big.xml
= = = = = = =
- data/small.xml
> > > > > > > branch
- src/prepare.py
params:
- prepare.seed
- prepare.split
outs:
- data/prepared
dvc.lock
无需手动解决锁文件的合并冲突。你可以安全地删除此文件。在合并 dvc.yaml
之后,可以通过运行 dvc repro
来重新生成一个干净的 dvc.lock
。
dvc commit
也是一个可行的选择,但仅适用于选择HEAD
版本的特定情况。
.dvc
文件
这些文件的结构主要有三种变体,取决于生成它们所使用的命令:
简单跟踪(add)
outs:
< < < < < < < HEAD
- md5: a304afb96060aad90176268345e10355
size: 12
= = = = = = =
- md5: 35dd1fda9cfb4b645ae431f4621fa324
size: 100
> > > > > > > branch
path: data.xml
你可以选择其中一个版本:
outs:
- md5: 35dd1fda9cfb4b645ae431f4621fa324
size: 100
path: data.xml
但如果你想真正合并两个版本的数据文件(或目录),可以按照以下流程操作:
- 在
HEAD
和branch
上分别运行dvc checkout data.xml
; - 将数据复制到临时位置(例如
data.xml.head
和data.xml.branch
); - 手动合并;
- 最后运行
dvc add data.xml
,以覆盖存在冲突的.dvc
文件。
目录
如果你有一个目录,DVC 提供了一个 Git 合并驱动程序,可以自动帮你解决许多合并冲突。要使用它,请先在你的 Git 仓库中进行设置:
$ git config merge.dvc.name 'DVC merge driver'
$ git config merge.dvc.driver \
'dvc git-hook merge-driver --ancestor %O --our %A --their %B'
并在你的 .gitattributes
文件(位于 Git 仓库根目录)中添加以下行:
*.dvc merge=dvc
现在,当发生合并冲突时,DVC 将自动合并两个分支的数据。
如果同一文件在两个分支中都被添加或修改,除非修改内容相同,否则合并驱动程序将失败。如果同一文件在两个分支中都被删除,合并驱动程序也会失败。
导入的数据
要解决由 dvc import
或 dvc import-url
生成的 .dvc
文件中的合并冲突,请完全移除冲突的值:
< < < < < < < HEAD
md5: 263395583f35403c8e0b1b94b30bea32
=======
md5: 520d2602f440d13372435d91d3bfa176
> > > > > > > branch
frozen: true
deps:
- path: get-started/data.xml
repo:
url: https://github.com/iterative/dataset-registry
< < < < < < < HEAD
rev_lock: f31f5c4cdae787b4bdeb97a717687d44667d9e62
= = = = = = =
rev_lock: 06be1104741f8a7c65449322a1fcc8c5f1070a1e
> > > > > > > branch
outs:
< < < < < < < HEAD
- md5: a304afb96060aad90176268345e10355
size: 12
= = = = = = =
- md5: 35dd1fda9cfb4b645ae431f4621fa324
size: 100
> > > > > > > branch
path: data.xml
使其变成如下形式:
frozen: true
deps:
- path: get-started/data.xml
repo:
url: https://github.com/iterative/dataset-registry
outs:
- path: data.xml
然后使用 dvc update
更新该 .dvc
文件,从原始源下载最新数据。
请注意,更新操作会从源获取数据的最新版本,该版本可能与你删除的任意哈希值都不一致。