在 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)

dvc add 生成的 .dvc 文件内容如下所示:

outs:
< < < < < < < HEAD
- md5: a304afb96060aad90176268345e10355
  size: 12
= = = = = = =
- md5: 35dd1fda9cfb4b645ae431f4621fa324
  size: 100
> > > > > > > branch
  path: data.xml

你可以选择其中一个版本:

outs:
  - md5: 35dd1fda9cfb4b645ae431f4621fa324
    size: 100
    path: data.xml

但如果你想真正合并两个版本的数据文件(或目录),可以按照以下流程操作:

  1. HEADbranch 上分别运行 dvc checkout data.xml
  2. 将数据复制到临时位置(例如 data.xml.headdata.xml.branch);
  3. 手动合并;
  4. 最后运行 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 importdvc 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 文件,从原始源下载最新数据。

请注意,更新操作会从源获取数据的最新版本,该版本可能与你删除的任意哈希值都不一致。

内容

🐛 发现问题?告诉我们!或者修复它:

在 GitHub 上编辑

有疑问?加入我们的聊天,我们会为您提供帮助:

Discord 聊天