restic 版本演进指南:从 CHANGELOG 解读备份工具的版本脉络、条目规范与发布流程
【免费下载链接】resticFast, secure, efficient backup program项目地址: https://gitcode.com/GitHub_Trending/re/restic
本篇技术指南以 restic 仓库根目录的 CHANGELOG.md 为主体,系统解读这份覆盖 0.6.0 至 0.19.1 共 40 个版本记录文件的结构、条目分类规范与生成机制。读完后,你将掌握:如何按条目类型(Security/Bugfix/Change/Enhancement)定位某个版本的 breaking change 与新增能力、restic 退出码体系与后端错误处理机制的演进过程、以及 changelog 目录条目 + 模板 + 发布脚本构成的 changelog 自动化生成流程。
一、文档结构与条目规范
CHANGELOG.md 全文约 7800 行,采用固定骨架组织:
- 目录区(Table of Contents):文件开头按版本倒序列出 40 个条目,从最新的 0.19.1(2026-07-05)一直回溯到 0.6.0(2017-05-29)。目录锚点由版本号与日期拼接生成(例如
#changelog-for-restic-0191-2026-07-05),这一拼接规则在模板 CHANGELOG.tmpl 中可以直接看到:#changelog-for-restic-{{ .Version | replace "." "" }}-{{ .Date | lower }}。 - 每个版本章节:一级标题为
# Changelog for restic <版本> (日期),说明文字统一为 "The following sections list the changes in restic <版本> relevant to restic users. The changes are ordered by importance.",即条目按重要性排序,而非按时间排序。 - Summary / Details 双层结构:每个版本先给出 Summary 摘要列表(短类型名 + issue 号 + 一句话标题),再在 Details 中逐条展开:问题背景(过去时)、新行为(现在时)、受影响的命令/后端/操作系统,末尾附上 issue、PR 与论坛链接。
条目类型(Type)的缩写规则可以从 Summary 与 Details 的对照中总结出来:
| 全名(Details) | 缩写(Summary) | 含义 | 示例(0.17.0) |
|---|---|---|---|
Security | Sec | 安全相关 | Sec #5291: Mitigate attack on content-defined chunking algorithm(0.18.0) |
Bugfix | Fix | 缺陷修复 | Fix #4209: Fix slow SFTP upload performance |
Change | Chg | 破坏性行为变更 | Chg #956: Return exit code 10 and 11 for non-existing and locked repository |
Enhancement | Enh | 功能增强 | Enh #1786: Support repositories with empty password |
每条条目引用一个"主 issue 号"(PrimaryID),Details 末尾的 URL 列表按 issue、PR、其他(如论坛帖)的顺序排列。
条目文件的书写规范
每个待发布条目以纯文本文件形式存放在 changelog/unreleased/ 目录(当前包含issue-21870、issue-3129、issue-5372、pull-21937等 9 个文件),文件名由第一个 issue 号决定。以 issue-5372 为例,其内容为:
Enhancement: Add command to list packfiles belonging to a snapshot This enhancement adds command `list packs snapshotID` to show the packfiles belonging to the given snapshot. https://github.com/restic/restic/issues/5372 https://github.com/restic/restic/pull/5396书写规则由模板文件 changelog/TEMPLATE 明确规定:
- 第一行必须以
Bugfix:、Enhancement:或Change:开头(含冒号);Change:专用于破坏性行为变更;纯文档改动不需要 changelog 条目; - 标题使用现在时与祈使语气,与命令相关时要把命令名写进标题(如
`restore`用反引号包裹); - 正文描述问题用过去时、描述新行为用现在时,使用 "Restic now ..." 而非 "We have changed ...";
- 聚焦用户可见行为而非实现细节,普通用户无需了解实现也能读懂;
- 末尾列出 issue / PR / 论坛 URL,第一个 issue 号决定文件名(无 issue 时用 PR 号,文件名为
pull-55555形式)。
二、CHANGELOG.md 的生成与发布流程
CHANGELOG.md 不是手写的,而是由外部工具calens从changelog/目录聚合生成。仓库内的证据链如下:
- Markdown 模板:changelog/CHANGELOG.tmpl 使用 Go text/template 语法,渲染目录、Summary 与 Details 两部分,其中
wrapIndent会把正文按 80 列宽度换行——这解释了为什么 CHANGELOG.md 中每行正文都是固定宽度的。 - 发布说明模板:changelog/changelog-github.tmpl 生成 GitHub Release 用的 rST 风格说明,并把 issue 号渲染为链接
[#{{ $id }}](https://github.com/restic/restic/issues/...)。 - 发布脚本:helpers/prepare-release/main.go 是
release-version工具,执行发布前会依次做前置检查,其中与 changelog 直接相关的有三处:preCheckChangelogRelease(main.go#L195-L207):检查是否存在changelog/<版本>_<日期>/目录,不存在则调用createChangelogRelease(main.go#L209-L234)把changelog/unreleased/下所有条目整体迁移到带日期戳的版本目录——这正是 CHANGELOG.md 目录名如changelog/0.19.0_2026-06-09/、changelog/0.18.0_2025-03-27/的来源;preCheckChangelogCurrent(main.go#L180-L193):执行calens --output CHANGELOG.md重新生成文件,若产生未提交变更则自动提交,保证 CHANGELOG.md 与条目目录始终一致;preCheckChangelogVersion(main.go#L236-L261):校验生成的 CHANGELOG.md 中确实包含Changelog for restic <版本>标题,否则中止发布。
此外,发布脚本还会校验当前处于master分支、工作区无未提交变更、git tag 不重复(main.go#L446-L465),随后生成 man 页与 shell 补全、更新版本号、打 tag、构建并签名发布物。版本号本身记录在 VERSION 文件中,当前仓库处于0.19.1-dev,即 0.19.1 的发布开发阶段,internal/global/global.go中的Version常量由脚本在发布时同步改写(main.go#L311-L341)。
对使用者的实际意义:如果你想为上游贡献修复,按changelog/TEMPLATE的格式在changelog/unreleased/添加一个issue-XXXX文件即可,无需(也不应该)手动编辑 CHANGELOG.md——它会在下次发布时自动聚合。
三、版本演进全景:40 个版本的时间线
下表按 CHANGELOG.md 目录区整理的完整版本序列(每个版本对应 changelog/ 下一个带日期戳的子目录):
| 版本 | 发布日期 | 标志性主题 |
|---|---|---|
| 0.6.0 / 0.6.1 | 2017-05-29 / 2017-06-01 | 早期版本记录起点 |
| 0.7.0 – 0.7.3 | 2017-07-01 – 2017-09-20 | 密集缺陷修复期 |
| 0.8.0 – 0.8.3 | 2017-11-26 – 2018-02-26 | 后端与仓库操作稳定化 |
| 0.9.0 – 0.9.6 | 2018-05-21 – 2019-11-22 | 小版本高频迭代 |
| 0.10.0 | 2020-09-19 | 索引格式相关历史问题的分界(见 0.19.0 中 #21820 说明) |
| 0.11.0 | 2020-11-05 | — |
| 0.12.0 / 0.12.1 | 2021-02-14 / 2021-08-03 | 0.12.1 起出现 SFTP 上传性能回归(0.17.0 修复 #4209) |
| 0.13.0 | 2022-03-26 | rest-server 0.13.0 起支持 unix socket 连接(见 0.17.0 #4287) |
| 0.14.0 | 2022-08-25 | — |
| 0.15.0 – 0.15.2 | 2023-01-12 – 2023-04-24 | — |
| 0.16.0 – 0.16.5 | 2023-07-31 – 2024-07-01 | 0.16.4 修复最高压缩级别下 zstd 数据损坏问题(#4677) |
| 0.17.0 – 0.17.3 | 2024-07-26 – 2024-11-08 | 可靠性大修:后端错误处理重构、退出码体系重建、功能开关机制 |
| 0.18.0 / 0.18.1 | 2025-03-27 / 2025-09-21 | 安全加固:内容定义分块攻击缓解;功能开关毕业清理 |
| 0.19.0 / 0.19.1 | 2026-06-09 / 2026-07-05 | 性能与可观测性:索引加载提速、mount 校验、Azure 上传成本优化 |
整体节奏上可以看出 restic 的发布策略:功能增强与破坏性变更集中在 0.x.0 的次版本中,.1/.2/.3 等修订版本以缺陷修复为主(例如 0.19.1 的 9 条条目全部是 Bugfix)。
四、0.17.0:退出码体系与后端可靠性重构
0.17.0(2024-07-26)是 changelog 中条目最多的版本之一,Summary 达 50 余条,其核心脉络是可脚本化与可恢复性。
4.1 退出码体系(Chg #956)
此前 restic 遇到"仓库不存在"或"仓库被锁定"一律返回退出码 1,无法与其他错误区分。0.17.0 起引入了语义化退出码,结合后续版本,从 changelog 中可以整理出如下演进表:
| 退出码 | 含义 | 引入版本(条目) |
|---|---|---|
| 10 | 仓库不存在 | 0.17.0(Chg #956) |
| 11 | 仓库存在冲突锁、无法加锁 | 0.17.0(Chg #956) |
| 12 | 密码错误(bad password) | 0.17.1(Enh #4959) |
| 130 | 被 SIGINT(Ctrl-C)终止 | 0.19.0(Fix #5258,此前返回 1) |
| 3 | 备份源路径缺失 / 部分源路径不可访问 /forget删除快照失败 | 0.19.0(Fix #4467、Fix #5233、Fix #5667) |
对运维脚本的含义是明确的:在 0.19.x 上,backup返回 3 即表示"备份不完整"(某个源路径不存在或不可访问,且若所有源都不可访问则直接中止),forget返回 3 表示有快照删除失败,init/打开仓库返回 10/11/12 则分别对应仓库不存在、锁冲突、密码错误。changelog 在 0.19.0 条目中特别点名了这一修复的动机:"Scripts that relied on the exit code could therefore treat an incomplete backup as success."
4.2 后端错误处理重构(Chg #4627)
0.17.0 用一整条 Change 条目描述了后端重试机制的重设计,要点包括:
- pack 文件改为分大块下载而非流式下载,避免流中断导致的失败;
restore会对单个取回的 blob 重试下载; - 上传或下载中卡住超过 2 分钟的 HTTP 请求会被强制中断,随后按短超时重试;
- 对缺失或被截断的文件不再重试,避免无谓重试;其他后端请求最长重试 15 分钟以容忍临时断网;
- 下载结果损坏时重试一次;
- 重构可通过
RESTIC_FEATURES=backend-error-redesign=false临时禁用。
这条条目涉及 7 个 issue/PR,是典型的"多 PR 聚合为一个用户可见行为"的 changelog 写法。仓库中internal/backend/retry目录对应的正是这套重试基础设施(从源码结构看,重试与限速分别位于internal/backend/retry与internal/backend/limiter)。配套的演进还有:0.17.1 的Enh #4970新增--stuck-request-timeout选项(大仓库上 5 分钟默认超时不够用时可调大);0.18.0 的Enh #5251为 rclone 后端增加"失败请求最多重试 5 次"的兜底;0.18.1 的Fix #5429让 rest-server 返回507 Insufficient Storage时停止无意义的重试。
4.3 功能开关机制(Enh #4601 及其生命周期)
0.17.0 引入RESTIC_FEATURES环境变量与restic features命令,用于启用/禁用实验特性。changelog 完整记录了四个开关的"引入—毕业—移除"生命周期,是理解 restic 变更管理风格的好样本:
- 0.17.0 引入并弃用旧行为:
Chg #4602弃用 0.2.0 之前的 legacy 索引格式(可用RESTIC_FEATURES=deprecate-legacy-index=false临时恢复,建议先运行restic repair index),并弃用 S3 旧布局s3legacy(可用RESTIC_FEATURES=deprecate-s3-legacy-layout=false restic migrate s3_layout迁移);Chg #4707默认关闭 S3 匿名认证,需显式-o s3.unsafe-anonymous-auth=true开启(临时回退开关为explicit-s3-anonymous-auth=false)。此外Fix #4568引入safe-forget-keep-tags开关,防止forget --keep-tags <不存在的tag>误删全部快照。 - 0.18.0 毕业(
Chg #5162):deprecate-legacy-index、deprecate-s3-legacy-layout、explicit-s3-anonymous-auth、safe-forget-keep-tags四个特性转为稳定,不可再关闭,且预告"对应的 feature flag 将在 0.19.0 中移除"。 - 0.19.0 兑现移除:
Chg #21791更新依赖并要求 Go 1.25+ 构建(0.18.0 的Chg #4938要求 Go 1.23+,同时禁用 TLS 1.2 以下版本、Windows 要求 10/Server 2016 以上、macOS 要求 11 Big Sur 以上)。
从源码结构看,这些开关的实现位于internal/feature包,changelog 中反复出现的 "This feature flag will be removed in the next minor restic version" 是该机制的固定提示语。
4.4 0.17.0 值得单独记住的增强
除上述主线外,0.17.0 还有一批被长期引用的功能增强:
Enh #1786:--insecure-no-password支持空密码仓库(init/copy对应--from-insecure-no-password,key add/key passwd对应--new-insecure-no-password);Enh #4601之外的快照能力:Enh #662的--skip-if-unchanged(无变化时跳过建快照)、Enh #693的快照大小统计(backup把 summary 存入快照,snapshots显示大小)、Enh #805的diffbitrot 检测(元数据相同而内容不同显示?,需配合backup --force);Enh #2348:restore --delete删除目标中快照里没有的文件,建议配合--dry-run --verbose=2先核对;Enh #4817:restore --overwrite四档覆盖策略(always/if-changed/if-newer/never);Enh #4287:通过 unix socket 连接 rest-server(要求 rest-server 0.13.0+):rest-server --listen unix:/tmp/rest.socket --data /path/to/data &+restic -r rest:http+unix:///tmp/rest.socket:/my_backup_repo/ ...;Enh #3067:Windows VSS 细调选项-o vss.timeout、-o vss.exclude-all-mount-points、-o vss.exclude-volumes、-o vss.provider;Enh #4611/#4708/#4807:Windows 元数据备份的三次扩充——创建时间与文件属性、SecurityDescriptor(DACL/SACL,需 backup operators 成员或管理员)、NTFS 扩展属性;Enh #3806:prune可断点续跑,索引更新只重写变更部分;Enh #4354:prune内存占用降低最多 60%。
0.17.1 至 0.17.3 的修订版本则以 Windows 场景修复为主:0.17.1 修复卷名C:(无尾斜杠)备份恢复问题(Fix #2004,旧快照需用restic restore 12345678:/C/C:./ --target output/folder语法恢复)、Chg #4953改为"元数据不完整也照常备份"(警告文案变为incomplete metadata for /path/to/file: <details>);0.17.2 的Fix #5057排除 irregular 文件并给出修复指令restic repair snapshots --forget;0.17.3 修复 macOS Sonoma 下mount不可用(Fix #4971)。
五、0.18.0:安全更新与内容定义分块攻击缓解
0.18.0(2025-03-27)的头条条目是安全修复Sec #5291: Mitigate attack on content-defined chunking algorithm,其技术细节值得展开:
- restic 的 CDC(内容定义分块)基于 Rabin 指纹,依赖一个秘密多项式切块;
- 论文 "Chunking Attacks on File Backup Services using Content-Defined Chunking"(Boris Alexeev, Colin Percival, Yan X Zhang, ePrint 2025/532)指出:能观察已知文件块大小的攻击者可推导出该秘密多项式,进而在某些场景下探测特定大文件是否存于仓库;
- restic 的缓解措施:随机化 chunk 组装进 pack 文件的顺序。changelog 同时客观评估了实际风险——restic 会把多个 chunk 合并进不透明 pack 且默认并行处理多个文件,攻击者难以把 pack 与已知文件对应起来,因此"实际攻击仍然困难";
- 该修复随 0.18.0 发布,意味着生产环境建议升级到 0.18.0 及以上。
0.18.0 其余要点(按 Summary 顺序归纳):
Fix #1843:旧版 Windows 上路径超过 256 字符的文件时间戳恢复正确;Fix #2165:目录列表与备份之间被删除的文件被静默跳过,不再报error: lstat ...: no such file or directory;Fix #5249:repair index --read-all-packs生成的巨型索引问题,索引现在正确切分为多个小索引,repair index也会自动拆分超限索引;Chg #5162:功能开关毕业(见 4.3 节);Enh #1378:check --json输出全部统计;Enh #4948:--json模式下退出错误也格式化为 JSON;Enh #3697:--exclude-cloud-files排除 OneDrive Files On-Demand 类纯在线文件(该选项后来在 0.19.0 扩展到 macOS 的 iCloud,见下文Enh #5352);Enh #4179:ls -l新增--sort <name|size|time|mtime|atime|ctime|extension>与--reverse;Enh #4433:find默认按快照从新到旧排序(--reverse可恢复旧顺序);Enh #4521:Azure Blob-o azure.access-tier=<Hot|Cool|Cold>选项(无官方 Archive 支持,自行负责恢复前的解冻);Enh #5173:实验性 S3 冷存储支持(feature flag "s3-restore",仅支持prune/copy/restore);Enh #5089:restore --include-xattr/--exclude-xattr控制扩展属性恢复;Enh #5054:dump导出 ZIP 时用 DEFLATE 压缩;Enh #5287:recover需要时自动重建索引,不再要求先手动repair index;Enh #4983:GHCR 镜像附 SLSA 供应链溯源信息;Enh #2511:generate --[shell]-completion -可把补全脚本写到 stdout。
0.18.1(2025-09-21)是典型的"回归修复"版本:0.18.0 引入的 chmod 不支持错误(CIFS/FUSE WebDAV 本地仓库,Fix #5342)、NetBSD 扩展属性EOPNOTSUPP(Fix #5344)、目录删除瞬间的偶发崩溃(Fix #5421)、--stdin-filename带目录路径报错Fatal: unable to save snapshot: open /foo: no such file or directory(Fix #5324)等,全部在次月修订中修复。这印证了"次版本承载变更、修订版本快速收敛回归"的发布节奏。
六、0.19.x:性能、可观测性与脚本友好性
6.1 0.19.0 的完整 Summary(2026-06-09)
0.19.0 的 Summary 共 40 条,是全量继承如下(Bugfix 18、Change 3、Enhancement 19):
- Fix #2034:
restic mount的 Windows 系统备份可经 Samba 共享服务 - Fix #4447:SFTP 方式创建的仓库目录使用 0700 权限
- Fix #4467:部分备份源路径不存在时以退出码 3 退出
- Fix #4759:环境变量
RESTIC_COMPRESSION/RESTIC_PACK_SIZE/RESTIC_READ_CONCURRENCY值非法时报错(除非命令行覆盖) - Fix #5233:
forget删除快照失败时返回退出码 3 - Fix #5258:SIGINT 时返回退出码 130
- Fix #5280:
find的--oldest晚于--newest时立即报错;find --pack对纯 tree 包也列出 blob - Fix #5354:后台运行 restic 时允许
rclone/sftp后端(修复restic -r rclone:./example --insecure-no-password init &可能拖垮 bash 的问题) - Fix #5427:Windows ACL 继承状态恢复正确(0.17.0 引入安全描述符备份后,ACE 继承标志一直按 explicit 处理)
- Fix #5477:
backup -v时密码提示偶发被隐藏 - Fix #5487:SFTP 后端新建仓库文件标记只读(服务器支持 chmod 时)
- Fix #5586:
snapshots --group-by与--latest组合行为正确 - Fix #5595:CIFS/FUSE WebDAV 等不支持 chmod 的文件系统上清除过期锁不再报
chmod ...: operation not supported - Fix #5683:
backup --stdin-from-command不再因上传失败后子进程输出未消费而挂起 - Fix #5757:
key passwd尊重--user与--host - Fix #21820:索引重写不再丢失被拆分的 pack 索引条目(0.10.0 之前极罕见 bug 的后续修复,
check现在会把此类情况报为可用repair packs修复的错误,仅仓库格式版本 1 可能受影响);repair packs现在同时利用索引与 pack 头信息抢救 blob - Chg #5293:
prune默认更积极地重打包小 pack 文件,--repack-small标记废弃,--repack-smaller-than仍可进一步控制 - Chg #5767:排除规则不再作用于显式传给
backup的路径(此前backup --exclude-if-present .git /home/user/data可能把整个data目录排掉,--exclude-larger-than 1M large-file.bin会产生空快照;目录内容仍受排除规则过滤) - Chg #21791:依赖更新,构建要求 Go 1.25+,修复 Go 1.26 下的 Windows 构建
- Enh #3326:
check可限定到快照过滤器(--tag/--host/--path/显式快照 ID)选中的快照 - Enh #3572:UNIX 下
restore --ownership-by-name按用户名/组名恢复属主(POSIX ACL 仍按数值恢复) - Enh #3738:
self-update支持GITHUB_ACCESS_TOKEN环境变量以认证请求,规避共享 IP 的 API 限流 - Enh #4278:
rewrite支持 include 过滤器(--include/--include-file/--iinclude/--iinclude-file/-i,与 exclude 互斥) - Enh #4728:zstd 压缩级别新增
fastest与better(RESTIC_COMPRESSION或--compression) - Enh #4868:
mount暴露的 FUSE 文件系统名包含仓库 ID(如restic:d3b07384d1),ID 可在打开仓库时打印或restic cat config读取 - Enh #5175:
copy --verbose文本模式打印待复制 blob 数、磁盘大小、源仓库读取的 pack 数 - Enh #5352:macOS 上支持
--exclude-cloud-files跳过 iCloud 云驻留文件(Sonoma/macOS 14.0 起可防止触发下载;旧版本仍会下载) - Enh #5383:进度条刷新率从 60 FPS 降到 10 FPS 以降低能耗,且部分终端才能选中文本
- Enh #5424:Windows 文件系统在任何文件访问之前就启用备份相关权限,避免扩展属性漏读
- Enh #5440:
--host=(空串)可覆盖RESTIC_HOST显示所有主机;同样适用于snapshots、forget、find、stats、copy、tag、repair snapshots、rewrite、mount、restore、dump、ls - Enh #5448:Docker 镜像支持
NICE、IONICE_CLASS、IONICE_PRIORITY环境变量配置调度优先级(实时类需要SYS_NICE能力),对应文档为 020_installation.rst 的 Docker 章节 - Enh #5453:
copy批量复制多个快照,避免小增量快照产生大量小 pack 文件 - Enh #5523:发布 Docker 镜像加入 OCI 注解标签
- Enh #5531:≤256 MiB 的文件在 Azure 上改用 PutBlob(一次事务)替代 PutBlock+PutBlockList(两次事务),事务费用约减半;更大 blob 仍用分块上传
- Enh #5562:状态栏每帧只重写发生变化的行,部分终端可正常选中文本
- Enh #5588:
snapshots输出底部显示时间戳所用的时区上下文(跨时区比较快照时有用) - Enh #5610:
check/copy/diff/stats处理大快照时内存占用更低 - Enh #5689:
stats扫描阶段报告已处理的快照/文件/blob 数量(此前只有scanning...) - Enh #5713:大仓库索引加载显著提速;
mount启动时一次性加载索引、之后增量加载新索引文件,且在打印"仓库已就绪"之前先加载快照 - Enh #5718:
mount在打开仓库之前就校验挂载点必须是当前用户可访问可写的目录(此前接受非法挂载点、加载仓库后才报错)
6.2 0.19.1 的 9 条修复(2026-07-05)
0.19.1 距 0.19.0 仅一个月,9 条条目全部是 Bugfix,其中多条是 0.19.0 新行为的快速收敛:
- Fix #5234:禁止把挂载点叠在仓库目录上。本地仓库目录作为
mount目标(或路径互相包含)时,FUSE 服务会经由新挂载读自己的后端文件,死锁内核、需要长时间重启才能恢复。restic 现在解析两个路径并在挂载前以明确错误拒绝任何重叠。 - Fix #5667:跳过不可访问的
backup源路径。此前只跳过"不存在"的路径;其他原因不可访问(如 Windows 上的畸形路径)会被保留并产生空快照。现在跳过此类路径,若全部不可访问则中止(配合退出码 3)。 - Fix #5722:快照重载后更新
mount的latest软链。restic mount常驻运行期间新建的快照虽然出现在挂载点,latest却可能仍指向旧的。现在重载快照目录后使缓存条目失效,latest指向最新快照。 - Fix #21866:
--json模式隐藏stats进度条。0.19.0 给stats加了进度条,却意外与 JSON 输出混排,已修复。 - Fix #21869:恢复
snapshots --latest <n>无--group-by时的旧行为。0.19.0 意外改为不按 host 和 paths 分组;现恢复按 host+paths 分组的默认行为,显式--group-by时仍按指定分组。 - Fix #21876:
snapshots时区标签更稳定。0.19.0 打印的时区名可能随夏令时变化,现在打印更一致、更短的文本。 - Fix #21879:挂载点不可 stat 时不再崩溃。0.19.0 的挂载点前置校验(
Enh #5718)在无法 stat 时 panic,现在正确返回错误。 - Fix #21895:SFTP 后端在 Windows 服务器上删除只读文件。0.19.0 开始 SFTP 保存后标记只读(
Fix #5487),Windows SFTP 服务器删除只读文件会权限报错;现在删除前先清除只读标志。这条与前一条共同展示了 changelog 中条目之间的因果链。 - Fix #21899:重复目录条目不再误报排除警告。0.19.0 起备份含重复目录条目的目录时,即使相关文件已被排除也会输出 "Warning: at least one source file could not be read",已修复。
值得注意的是 issue 编号从 5xxx 跃升到 21xxx(如 #21820、#21866):从条目链接指向github.com/restic/restic仓库看,这些大编号条目与changelog/0.19.0_2026-06-09/、changelog/0.19.1_2026-07-05/、changelog/unreleased/中同名文件一一对应,可以推断它们是同一仓库 issue 空间在更高编号段的延续(例如changelog/unreleased/pull-21937、changelog/0.19.0_2026-06-09/pull-21796),仓库内不做额外标注,读者可直接通过条目录入的链接核对。
七、从 CHANGELOG 看升级决策与排障
综合上述内容,CHANGELOG 对实际运维有四个可操作价值:
- 安全与可靠性基线:生产环境最低建议 0.18.0(CDC 分块攻击缓解,
Sec #5291);若仓库是格式版本 1 且经历过 0.10.0 之前的历史 bug,升级 0.19.x 后运行repair packs处理拆分索引条目(Fix #21820),旧版本可运行两次repair index。 - 脚本行为对齐:自动化脚本应针对 0.19.x 的退出码语义(3=源缺失/部分删除失败、10=无仓库、11=锁冲突、12=密码错误、130=SIGINT)编写判断;0.17.0 之前的"一切皆 1"语义已不可靠。
- 破坏性变更清单:升级次版本前重点核对
Change:条目——0.17.0 的退出码与 S3 匿名认证、0.19.0 的"显式备份路径不受排除规则影响"(Chg #5767)与 Go 1.25 构建要求、0.16.4 的 zstd 降级(修复最高压缩级别数据损坏Fix #4677)、0.17.0 的 ARMv6 最低要求(Chg #4540)等,都是直接影响部署的条目。 - 排障线索:许多条目的 Details 保留了原始报错文本(如 0.17.3 的 VSS 元数据错误、0.18.0 的
repair index巨型索引、0.17.0 的unable to create lock in backend: circuit breaker open类信息),遇到相似报错时按报错中的命令名反查对应版本条目,可以快速定位修复版本。仓库的排障手册 077_troubleshooting.rst 与 changelog 条目(如 0.17.0Enh #828对repair packs的指引)互为补充。
八、小结
restic 的 CHANGELOG.md 是"条目驱动"发布工程实践的一个完整样本:changelog/TEMPLATE 规定单条写作规范,changelog/unreleased/收集待发布条目,changelog/CHANGELOG.tmpl 与 changelog/changelog-github.tmpl 分别渲染仓库内 Markdown 与 GitHub Release 说明,helpers/prepare-release/main.go 在发布时完成目录迁移、自动再生成与版本存在性校验。对使用者而言,这份 40 个版本的记录既是升级前的变更核对单,也是 restic 在可靠性(后端重试、索引修复、退出码)、安全(CDC 缓解、SFTP 权限)与可运维性(JSON 输出、Docker 调度配置、性能优化)三条主线上持续演进的第一手依据。
【免费下载链接】resticFast, secure, efficient backup program项目地址: https://gitcode.com/GitHub_Trending/re/restic
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考