DVC 如何将目录级别的差异存储到 DVC 缓存中?

mkh*_*hlr 5 version-control dvc

有人可以解释一下 DVC 如何将目录级别的差异存储到 DVC 缓存中。

据我了解,DVC 文件 (.dvc) 是用于跟踪数据、模型和重现管道阶段的图元文件。然而,我不清楚创建分支、提交分支并切换回主文件的过程是如何准确保存在差异中的。

don*_*ito 4

简洁版本:

\n\n
    \n
  1. .dvc文件包含有关缓存内 JSON 文件的信息 (md5),该信息描述了目录的当前状态。

  2. \n
  3. 当目录更新时,.dvc文件中会有新的 md5,并且会使用目录的更新状态创建新的 JSON 文件。

  4. \n
  5. 在 git 中,您存储 .dvc文件,以便 DVC 知道(基于 md5)在哪里查找有关目录的信息。

  6. \n
\n\n

更长的版本:

\n\n

让我尝试打破使用 DVC 进行目录处理的特定步骤。

\n\n
    \n
  • 假设我们有一些要在 DVC 控制下添加的数据目录:
  • \n
\n\n
data\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 1\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 2\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • 您正在使用dvc add dataDVC 跟踪您的目录。结果,DVC 生成data.dvc文件。正如您所指出的,此文件包含将 git 存储库与数据存储连接所需的元数据。在此文件中(除了其他内容)您可以看到:
  • \n
\n\n
outs:\n- md5: f437247ec66d73ba66b0ade0246fcb49.dir\n path: data\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • md5部分用于存储有关 DVC 缓存中目录的信息 ( .dvc/cache):
  • \n
\n\n
(dvc3.7) \xe2\x9e\x9c  repo$ tree .dvc/cache\n.dvc/cache\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 26\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ab0db90d72e28ad0ba1e22ee510510\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 b0\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 26324c6904b2a9cb4b88d6d61c81d1\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 f4\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 37247ec66d73ba66b0ade0246fcb49.dir\n\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • 如果您打开带有.dir后缀的文件,您将看到它包含当前data状态的描述:
  • \n
\n\n
(dvc3.7) \xe2\x9e\x9c  repo$ cat .dvc/cache/f4/37247ec66d73ba66b0ade0246fcb49.dir \n[{"md5": "b026324c6904b2a9cb4b88d6d61c81d1", "relpath": "1"},\n {"md5": "26ab0db90d72e28ad0ba1e22ee510510", "relpath": "2"}]\n
Run Code Online (Sandbox Code Playgroud)\n\n

如您所见,特定文件(12)由该文件中的条目描述

\n\n
    \n
  • 当您更改目录时:
  • \n
\n\n
(dvc3.7) \xe2\x9e\x9c  repo$ echo 3 >> data/3 \n(dvc3.7) \xe2\x9e\x9c  repo$ dvc commit data.dvc\n
Run Code Online (Sandbox Code Playgroud)\n\n

data.dvc即将更新的内容:

\n\n
outs:\n- md5: 12f4b7d54a32e58818e27fba28376fba.dir\n  path: data\n
Run Code Online (Sandbox Code Playgroud)\n\n

缓存中有新文件:

\n\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 12\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 f4b7d54a32e58818e27fba28376fba.dir\n...\n\n(dvc3.7) \xe2\x9e\x9c  repo$ cat .dvc/cache/12/f4b7d54a32e58818e27fba28376fba.dir \n[{"md5": "b026324c6904b2a9cb4b88d6d61c81d1", "relpath": "1"},\n {"md5": "26ab0db90d72e28ad0ba1e22ee510510", "relpath": "2"},\n {"md5": "6d7fce9fee471194aa8b5b6e47267f03", "relpath": "3"}]\n
Run Code Online (Sandbox Code Playgroud)\n\n

从 git 的角度来看,唯一的变化是在内部data.dvc。\n(假设你git commit在添加datawith12inside 后做了):

\n\n
diff --git a/data.dvc b/data.dvc\nindex 098aec5..88d1a90 100644\n--- a/data.dvc\n+++ b/data.dvc\n@@ -1,6 +1,6 @@\n-md5: a427c5bf8680fbf8d1951806b28b82fe\n+md5: 1b674d61c195eea7a6b14f176c020b9c\n outs:\n-- md5: f437247ec66d73ba66b0ade0246fcb49.dir\n+- md5: 12f4b7d54a32e58818e27fba28376fba.dir\n   path: data\n   cache: true\n   metric: false\n
Run Code Online (Sandbox Code Playgroud)\n\n

注意:第一个md5对应于该文件的md5,因此它必须随dir md5更改而更改

\n