还原 dvc remove -p 命令

Revert a dvc remove -p command

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

你很可能是安全的(至少数据没有丢失)。来自 dvc remove docs:

Note that it does not remove files from the DVC cache or remote storage (see dvc gc). However, remember to run dvc push to save the files you actually want to use or share in the future.

因此,如果您创建了 training_data.dvcdvc add and/or dvc run 并且 dvc remove -p 没有 ask/warn 任何事情,意味着数据缓存类似于 .dvc/cache 中的 Git。

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

正在恢复目录

首先,here是一篇简单描述DVC如何在缓存中存储目录的文档。

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

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 在此文件上。

应该是这样。