---
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. 刪除剩餘的版本。
