---
date: "2022-11-01T00:00:00+00:00"
slug: "storage"
sidebar_position: 5
---

# 存儲

本文檔描述了軟體包註冊表的存儲方式以及如何管理存儲。

## 去重

軟體包註冊表具有内置的去重功能，可以对上传的 Blob 進行去重处理。
如果上传了两个相同的文件，只会在文件系统上保存一个 Blob。
这样可以确保不会浪费空间用于重复的文件。

如果上传了两个具有相同文件的軟體包，这两个軟體包将显示相同的大小，但在文件系统上，它们只需要一半的大小。
每当删除一个軟體包时，只会删除对底层 Blob 的引用。
此时，Blob 不会被删除，因此它们仍然占用文件系统上的空间。
当上传新的軟體包时，現有的 Blob 可能会再次被引用。

这些無引用的 Blob 会在一个清理任务中被删除。
配置设置 `OLDER_THAN` 可以配置無引用的 Blob 在被删除之前保留的时间。

## 清理規則

軟體包註冊表可能会随着时间的推移而变得很大，如果不進行清理的话。
建议删除不必要的軟體包並设置清理規則以自动管理軟體包註冊表的使用情况。
每个軟體包所有者（使用者或組織）都可以管理應用于其軟體包的清理規則。

| 设置                         | 描述                                                                                                                                     |
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| 启用                         | 打开或关闭清理規則。                                                                                                                     |
| 類型                         | 每个規則管理特定的軟體包類型。                                                                                                           |
| 将模式應用于完整的軟體包名稱 | 如果启用，则應用以下模式到完整的軟體包名稱（`package/version`），否则只使用版本号（`version`）。                                         |
| 保留最近的版本数             | 對於每个軟體包要始终保留的版本数量。                                                                                                     |
| 保留与以下模式匹配的版本     | 确定要保留哪些版本的正则表达式模式。空模式表示不保留任何版本，而 `.+` 表示保留所有版本。即使未配置，容器註冊表也始终保留 `latest` 版本。 |
| 删除早于多少天的版本         | 僅删除早于所選天数的版本。                                                                                                               |
| 删除与以下模式匹配的版本     | 确定要删除哪些版本的正则表达式模式。空模式或 `.+` 表示如果没有其他设置指定，则删除所有軟體包。                                           |

每个清理規則都可以显示受影響的軟體包的预览。
这可以用来检查清理規則是否正确配置。

### 正则表达式示例

正则表达式模式会自动使用 `\A` 和 `\z` 锚点進行包围。
不要在正则表达式模式中包含任何 `\A`、`\z`、`^` 或 `$` 标记，因為它们不是必要的。
模式是不区分大小写的，与 Gitea 中的軟體包註冊表的行為相匹配。

| Pattern                      | Description                                                                                                   |
| ---------------------------- | ------------------------------------------------------------------------------------------------------------- |
| `.*`                         | 匹配任何可能的版本。                                                                                          |
| `v.+`                        | 匹配以 `v` 開頭的版本。                                                                                       |
| `release`                    | 僅匹配版本号為 `release`。                                                                                    |
| `release.*`                  | 匹配以 `release` 命名或以 `release` 開頭的版本。                                                              |
| `.+-temp-.+`                 | 匹配包含 `-temp-` 的版本。                                                                                    |
| `v.+\|release`               | 匹配以 `v` 開頭的版本或版本号為 `release`。                                                                   |
| `package/v.+\|other/release` | 匹配以 `v` 開頭的 package 的版本或 `other` 的版本号為 `release`。需要启用*将模式應用于完整的軟體包名稱*设置。 |

### 清理規則的工作原理

清理規則是清理任务的一部分，定期运行。

清理規則：

1. 收集所有属于所有者註冊表的特定軟體包類型的軟體包。
2. 對於每个軟體包，收集所有版本。
3. 根据 *保留最近的版本数* 的值，从列表中排除版本。
4. 根据 *保留与以下模式匹配的版本* 的值，从列表中排除任何版本。
5. 根据 *删除早于多少天的版本* 的值，从列表中排除比这个值更近的版本。
6. 根据 *删除与以下模式匹配的版本* 的值，从列表中排除任何不匹配的版本。
7. 删除剩余的版本。
