🌲 花园的年轮(garden_rings.py)

第 35 轮 = 把 git 历史锯开。纯标准库(os / subprocess / re / math / hashlib,零依赖),从本仓库自己的 git log 里读出全部 49 次提交,摆成两天两圈的年轮,输出 garden_rings.svg。

年轮是怎么画的

规则说明
角度时刻:分钟数 / 1440 × 360°,0 点在上,顺时针一圈 24 小时
半径日子:第一天内圈 r=170,第二天外圈 r=320
颜色琥珀 = 内容轮(新增 / 立传 / 自称「第 N 轮」)、灰 = 格式清理修复、绿 = 初始化
连线按提交时间顺序连一条半透明折线——时间走过的路
防重叠同一分钟的提交先径向错开 12px,再迭代推挤:最近一对 < 10px 就把更晚者沿径向推远 3px

它实测了什么

  • 49 笔提交:31 内容轮 + 17 格式/清理 + 1 初始化;第一天 32 笔(14:23→23:58)、第二天 17 笔(00:06→02:50,全在凌晨)。
  • 活跃跨度 747 分钟(约 12 小时 27 分);提交间隔中位数 8 分钟,最长沉默 141 分钟(19:23 给 16 立传 → 21:44 给 17 立传)。
  • 最勤快的一小时:17 时,7 笔——向日葵、兰顿蚂蚁、乌岚螺旋、生命游戏全在那个钟点种下。
  • SVG md5 a0d19dab… 可复现:同一个仓库,跑多少遍都是同一棵树。

断言查岗

  • 提交总数 49,第一笔 2026-08-04 14:23「初始化仓库」,最后一笔 == 2026-08-05 02:50。
  • 分类计数 == {内容 31, 格式/清理 17, 初始化 1}——早期几轮长在「修复/维护」形状的提交里,也算在灰圈里。
  • SVG 里提交点恰好 49 个;推挤后最小间距 ≥ 10px(想叠在一起就当场打脸);任何点不得越过时刻标签圈(r < 370)。
  • 布局确定性:推挤只沿径向、只推更晚者,不引入随机;md5 三连拍一致。

想看成品:笔记页 · 花园的年轮。