3

我刚刚使用命令错误地删除了一个 DVC 跟踪文件dvc remove training_data.dvc -p,这导致我的所有训练数据集完全消失。我知道在 Git 中,我们可以轻松地根据其哈希恢复已删除的分支。有谁知道如何恢复我在 DVC 中丢失的所有数据?

4

1 回答 1

3

你应该是安全的(至少数据没有消失)。从dvc remove 文档

请注意,它不会从 DVC 缓存或远程存储中删除文件(请参阅 dvc gc)。但是,请记住运行dvc push以保存您将来真正想要使用或共享的文件。

因此,如果您training_data.dvc使用dvc add和/或创建dvc rundvc remove -p没有询问/警告您任何事情,则意味着数据缓存类似于 Git 中的.dvc/cache.

有一些方法可以检索它,但我需要知道更多细节 - 你究竟是如何添加数据集的?你提交training_data.dvc了还是完全消失了?到目前为止,它是您添加的唯一数据吗?(很高兴在评论中为您提供帮助)。

恢复目录

首先,这里是简要描述DVC如何在缓存中存储目录的文档。

我们可以做的是找到所有.dir文件.dvc/cache

find .dvc/cache -type f -name "*.dir"

输出类似:

.dvc/cache/20/b786b6e6f80e2b3fcf17827ad18597.dir
.dvc/cache/00/db872eebe1c914dd13617616bb8586.dir
.dvc/cache/2d/1764cb0fc973f68f31f5ff90ee0883.dir

(如果本地缓存丢失并且我们正在从远程存储恢复数据,同样的逻辑适用,命令(例如,在 S3 上查找扩展名为 .dir 的文件)看起来不同)

每个.dir文件都是一个 JSON,其内容是目录的一个版本(文件名、哈希等)。它具有恢复它所需的所有信息。接下来我们需要做的是了解我们需要哪一个。没有一个单一的规则,我建议检查(并根据您的用例选择):

  • 检查修改日期(如果您记得添加此数据的时间)。
  • 检查这些文件的内容——如果你记得一个特定的文件名,它只存在于你正在寻找的目录中——只需 grep 即可。
  • 尝试将它们一一还原并检查目录内容。

好的,现在让我们假设我们决定要恢复.dvc/cache/20/b786b6e6f80e2b3fcf17827ad18597.dir,(例如,因为它的内容看起来像:

[
{"md5": "6f597d341ceb7d8fbbe88859a892ef81", "relpath": "test.tsv"}, {"md5": "32b715ef0d71ff4c9e61f55b09c15e75", "relpath": "train.tsv"}
]

我们想得到一个目录train.tsv)。

我们唯一需要做的就是创建一个.dvc引用该目录的文件:

outs:
- md5: 20b786b6e6f80e2b3fcf17827ad18597.dir
  path: my-directory

(注意,路径 /20/b786b6e6f80e2b3fcf17827ad18597.dir 变成了哈希值:20b786b6e6f80e2b3fcf17827ad18597.dir)

dvc pull在这个文件上运行。

应该是这样的。

于 2020-06-18T05:17:16.920 回答