---
date: 2026-05-14
tags: [gitea, pr, workflow, conventions]
status: documented
---

# Gitea PR auto-close issue 必须用 closing keywords，markdown link 不算

## 现象

[PR #363](http://43.130.59.228/FFAIWorkspace/workspace/pulls/363) 是为工单 #310 做的实施 + 演练。PR 描述里写：

```markdown
## 关联

- 工单：[#310](http://43.130.59.228/FFAIWorkspace/workspace/issues/310)
```

PR merge 后 issue **没有自动 close**——还得手工 PATCH `state: closed`。

## 根因

Gitea（跟 GitHub 一样）只识别**特定关键词** + issue 编号才会在 PR/commit merge 时自动关 issue。markdown link 形式的 `[#310](url)` 只是文字引用，不触发关单。

**支持的 closing keywords**（不分大小写）：

- `Closes #310` / `Closed #310` / `Close #310`
- `Fixes #310` / `Fixed #310` / `Fix #310`
- `Resolves #310` / `Resolved #310` / `Resolve #310`

可以一次关多个：`Closes #310, fixes #311 and resolves #312`

也支持跨仓库：`Closes owner/repo#310`

## 规则

**给 issue 做实施的 PR 必须**在 description 顶部用 closing keyword：

```markdown
## 关联

Closes #310

详细背景：见 [#310](http://43.130.59.228/...)  ← markdown link 仍然可以做导航用
```

两者并存最好——closing keyword 让自动化生效，markdown link 让人点开方便。

## 反面教训：等月度验证才关 issue 的反模式

这次还踩了一个**判断错误**：PR description 里写"等 2026-06-13 首次月度验证通过再关"——结果工单一直挂着 open。

更对的做法：
- 实施 + 首次演练通过 = 工单完成 = **该关就关**
- 月度验证是**周期性 SOP**，有它自己的载体（`docs/ops/10-backup-strategy.md § 4.3` 历次演练记录表）
- 如果某次月度验证失败，**新开 incident issue** 跟踪，不要复用已关闭的实施工单

**通用规则**：工单状态反映"这件事还没做完"，不是"还可能出问题"。可能出问题用监控 / SOP / incident issue 兜底，不要让工单 open 状态承担这个职责。

## 关联

- 工单 [#310](http://43.130.59.228/FFAIWorkspace/workspace/issues/310)
- PR [#363](http://43.130.59.228/FFAIWorkspace/workspace/pulls/363)
- Gitea closing keywords 官方文档：https://docs.gitea.com/usage/issue-pull-request#closing-issues-via-commits-and-pull-requests
