# 不可变版本

了解不可变版本以及它们如何帮助维护软件供应链的完整性。

```
          **不可变版本**是指发布后资产和相关 Git 标签无法更改的版本。 这种版本的使用通过阻止供应链攻击来提高安全性。 攻击者无法：
```

* 将漏洞或恶意软件注入当前项目版本。
* 对可能会中断开发人员工作流的资产和标记进行更改。

## 不可变版本保护的内容

启用不可变版本时，将强制实施以下保护：

* **无法移动 Git 标记**：发布不可变版本后，其关联的 Git 标记被锁定到特定提交，无法更改，且在发布存在时无法删除。 如果删除不可变版本，则可以删除标记，但不能重复使用相同的标记名称。
* **无法修改或删除发布资产**：附加到发布的所有文件（如二进制文件和存档）均受到修改或删除的保护。

此外，创建不可变版本会自动生成发布证明，该证明是包含发布标签、提交 SHA 和发布资产的加密可验证发布记录\*\*\*\*。 使用者可以使用此证明来确保它们使用的发布和项目与发布的 GitHub 版本完全匹配。

> \[!NOTE]
> 不可变版本包括针对存储库复活攻击的保护。 即使删除存储库并创建具有相同名称的新存储库，也不能重复使用与原始存储库中不可变版本关联的标记。

如果发布是不可变的，你将在发布页上的标题下方看到“<svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-lock" aria-label="lock icon" role="img"><path d="M4 4a4 4 0 0 1 8 0v2h.25c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 12.25 15h-8.5A1.75 1.75 0 0 1 2 13.25v-5.5C2 6.784 2.784 6 3.75 6H4Zm8.25 3.5h-8.5a.25.25 0 0 0-.25.25v5.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-5.5a.25.25 0 0 0-.25-.25ZM10.5 6V4a2.5 2.5 0 1 0-5 0v2Z"></path></svg> 不可变”。

## 发布不可变版本的最佳做法

建议使用以下工作流发布不可变版本。

1. 将版本创建为草稿。
2. 将所有关联资产附加到草稿版本中。
3. 发布草稿版本。

这确保在版本变为不可变之前所有资产都已到位，避免了因不可变限制而需要绕行的问题。

## 后续步骤

要了解如何为仓库或组织启用不可变版本，请参阅 [阻止对版本进行更改](/zh/code-security/supply-chain-security/understanding-your-software-supply-chain/preventing-changes-to-your-releases)。

要了解如何确保版本和本地资产未发生更改，请参阅 [验证版本的完整性](/zh/code-security/supply-chain-security/understanding-your-software-supply-chain/verifying-the-integrity-of-a-release)。