我刚刚使用命令错误地删除了一个 DVC 跟踪文件dvc remove training_data.dvc -p
,这导致我的所有训练数据集完全消失。我知道在 Git 中,我们可以轻松地根据其哈希恢复已删除的分支。有谁知道如何恢复我在 DVC 中丢失的所有数据?
1 回答
你应该是安全的(至少数据没有消失)。从dvc remove
文档:
请注意,它不会从 DVC 缓存或远程存储中删除文件(请参阅 dvc gc)。但是,请记住运行
dvc push
以保存您将来真正想要使用或共享的文件。
因此,如果您training_data.dvc
使用dvc add
和/或创建dvc run
并dvc 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
在这个文件上运行。
应该是这样的。