我刚刚使用命令 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.dvc
与 dvc add
一样和/或 dvc run
和 dvc remove -p
没有询问/警告您任何事情,这意味着数据缓存类似于 .dvc/cache
中的 Git .
有多种方法可以检索它,但我需要了解更多细节 - 您究竟是如何添加数据集的?你有没有提交 training_data.dvc
或者它完全消失了?到目前为止,这是您添加的唯一数据吗? (很高兴在评论中为您提供帮助)。
恢复目录
首先,here是简要描述 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
file 是一个 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
在这个文件上。
应该是这样吧。
关于dvc - 还原 dvc remove -p 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62441146/