gc
从缓存或远程存储中删除未使用的文件和目录。
概要
usage: dvc gc [-h] [-q | -v]
[-w] [--rev <commit>] [-n <num>] [-a] [-T] [-A]
[--date <YYYY-MM-DD>] [--all-experiments]
[-p [<path> [<path> ...]]]
[--not-in-remote]
[-c] [-r <name>] [-j <number>] [-f] [--dry]
描述
该命令可以删除(垃圾回收)存在于缓存中但不再需要的数据文件或目录。使用--cloud
时,它还会删除远程存储中的数据。
为避免意外删除数据,除非提供一个或多个作用域选项(--workspace
、--all-branches
、--all-tags
、--all-commits
、--all-experiments
),否则dvc gc
不会执行任何操作。请使用这些选项来指明哪些缓存文件仍被需要。详见选项部分。
保留的数据由给定作用域内提交集合中的DVC 文件决定。
请注意,
dvc gc
会尝试从远程存储将缺失的.dir
文件 拉取到本地缓存,以确定缓存目录中应包含哪些文件。如果缓存之前已被垃圾回收,或在新克隆的仓库副本中,这些文件可能缺失。
除非使用 --cloud
选项,否则只要数据此前已通过 dvc push
上传,就可以使用 dvc fetch
恢复从缓存中删除的文件。
删除远程存储中的数据
如果使用了 --cloud
(-c
) 标志,此命令除了删除本地 DVC 缓存中的无用数据外,还将从 dvc remote default
中删除数据。此外,要指定要从中删除数据的 DVC 远程存储,请使用 --remote
(-r
) 选项。
云存储上的删除是不可逆的,除非存在另一个包含相同数据的 DVC 远程存储或手动备份。
清理共享缓存(或远程存储)
如果多个项目共享同一个缓存并跟踪部分相同的文件,在一个项目中使用dvc gc
将会破坏其他项目中重叠的数据链接。
为防止这种情况,请使用 --projects
(-p
) 选项。它可以接收一个或多个 DVC 项目的路径,确保这些项目中的数据不会被删除。请确保所有引用你希望保留文件的提交和分支已在其他项目中拉取。
例如,如果我们有多个项目且部分文件重叠,并希望清除仅在一个项目中使用的所有数据(例如,我们不再需要该项目),我们可以先克隆所有其他项目,获取它们的所有分支,然后将这些项目的路径传递给要清理的项目中的 dvc gc -p
命令。
选项
-
-w
,--workspace
- 仅保留工作区中引用的文件和目录。此选项会在启用其他作用域选项(如下所示)时自动激活。 -
--rev <commit>
- 保留指定<commit>
中引用的缓存数据,以及工作区中的数据(隐含-w
)。 -
-n <num>
,--num <num>
- 从指定的--rev <commit>
(必需)开始,保留最近--num
个提交中引用的缓存数据,以及工作区中的数据(隐含-w
)。 -
-a
,--all-branches
- 保留所有 Git 分支中引用的缓存数据,以及工作区中的数据(隐含-w
)。如果使用分支来跟踪不同实验,则此选项非常有用。注意,此选项可与下方的-T
结合使用,例如通过-aT
标志。 -
-T
,--all-tags
- 保留所有 Git 标签中引用的缓存数据,以及工作区中的数据(隐含-w
)。如果使用标签标记实验或项目的某些版本,则此选项非常有用。注意,此选项可与上方的-a
结合使用,例如通过-aT
标志。 -
-A
,--all-commits
- 保留所有* Git 提交中引用的缓存数据,以及工作区中的数据(隐含-w
)。这将保留项目整个提交历史中使用过的所有数据的缓存。该选项的一个使用场景是:在未提交更改的情况下运行
dvc exp run
和/或dvc repro
时,安全地删除所有临时数据缓存(参见这些命令中的-O
或-M
以及--no-commit
选项)。在此情况下,从未在工作区或任何 Git 提交中被引用的数据仍可能存储在项目的缓存中。* 不包括 DVC 实验
-
--date <YYYY-MM-DD>
- 保留从指定日期当天或之后的任意提交中的实验数据。<YYYY-MM-DD>
参数需采用 ISO 8601 格式的日期。 -
--all-experiments
- 保留所有 DVC 实验 中引用的缓存对象,以及工作区中的数据(隐含-w
)。这将保留项目的 实验性 数据。 -
-p <paths>
,--projects <paths>
- 如果多个项目共享同一个远程存储或单一缓存,可以使用此选项指定项目路径列表,以保留当前这些项目中引用的数据(每个项目为一个路径)。 -
--not-in-remote
- 保留本地缓存中但不在远程存储中的缓存对象。这将删除那些已推送到远程且存在于远程的本地缓存对象。对于使用了
remote
字段 的对象,检查将在该远程进行。对于未使用
remote
字段 的对象,除非通过-r
指定了特定远程,否则检查将在默认远程上进行。 -
-c
,--cloud
- 除清理本地缓存外,同时删除远程存储中的文件。此选项具有危险性,请仔细阅读说明。
对于使用了
remote
字段 的对象,检查将在该远程进行。其他未使用该字段的文件可能会从该远程中被删除。对于未使用
remote
字段 的对象,除非通过-r
指定了特定远程,否则检查将在默认远程进行。而其他使用了remote
字段的文件可能会从该远程中被删除。 -
-r <name>
,--remote <name>
- 当指定了-c
选项时,用于指定从哪个dvc remote
收集未使用的对象(参见dvc remote list
)。 -
-j <number>
,--jobs <number>
- 指定 DVC 从远程存储读取数据时的并行任务数量。仅当使用--cloud
选项或指定了--remote
时生效。默认值为4 * cpu_count()
。注意,可通过dvc remote modify
命令设置jobs
配置项来自定义默认值。增加任务数可能加快操作速度。目前只有部分垃圾回收阶段是并行的。
-
-f
,--force
- 强制执行垃圾回收,跳过确认提示。 -
--dry
- 仅打印将要删除的内容,但不实际删除。 -
-h
,--help
- 打印使用说明/帮助信息,然后退出。 -
-q
,--quiet
- 不向标准输出写入任何内容。如果没有问题则以 0 退出,否则以 1 退出。 -
-v
,--verbose
- 显示详细的跟踪信息。
示例
清理 缓存 的基本示例:
$ du -sh .dvc/cache/
7.4G .dvc/cache/
当你运行 dvc gc --workspace
时,DVC 会从缓存中删除所有未在 工作区 中被引用的对象(通过从 DVC 文件 收集哈希值):
$ dvc gc --workspace
'.dvc/cache/files/md5/27e30965256ed4d3e71c2bf0c4caad2e' was removed
'.dvc/cache/files/md5/2e006be822767e8ba5d73ebad49ef082' was removed
'.dvc/cache/files/md5/2f412200dc53fb97dcac0353b609d199' was removed
'.dvc/cache/files/md5/541025db4da02fcab715ca2c2c8f4c19' was removed
'.dvc/cache/files/md5/62f8c2ba93cfe5a6501136078f0336f9' was removed
'.dvc/cache/files/md5/7c4521365288d69a03fa22ad3d399f32' was removed
'.dvc/cache/files/md5/9ff7365a8256766be8c363fac47fc0d4' was removed
'.dvc/cache/files/md5/a86ca87250ed8e54a9e2e8d6d34c252e' was removed
'.dvc/cache/files/md5/f64d65d4ccef9ff9d37ea4cf70b18700' was removed
现在我们检查一下大小:
$ du -sh .dvc/cache/
3.1G .dvc/cache/