feat: git retime 改为在 --start-date/--end-date 区间内均匀分布提交

- 新增 --end-date:提交按比例铺满 [start-date, end-date],第 i 个提交
  落在第 i×天数÷提交数 天,提交远少于天数时也不会堆在第一天
- 移除 --per-day / --day-gap:原先的“每天一个、日期顺延”语义不直观
- 只给 --start-date 时集中在该日;--end-date 需配合 --start-date 且不早于它
- 同一天的多条提交仍按顺序落在 21:00-23:00 之间
- 文档与预览文案同步为区间语义
This commit is contained in:
2026-11-01 10:11:39 +08:00
parent 1ae9488d8a
commit 84aa91ba7f
7 changed files with 157 additions and 130 deletions
+20 -18
View File
@@ -23,8 +23,8 @@ kopsc git retime 2026-10-01 2026-10-15 --window 20:00-22:30 # 换一个时间
kopsc git retime 2026-10-01 2026-10-15 --seed 42 # 固定随机种子,结果可复现
kopsc git retime 2026-10-01 2026-10-15 --no-push --yes # 只改本地,不推送
# 连日期一起重排:从 2026-11-01 起,每天 2 个提交,日期间隔 3 天
kopsc git retime 2026-10-01 2026-10-15 --start-date 2026-11-01 --per-day 2 --day-gap 3
# 连日期一起重排:把提交均匀分布到 2026-11-01 至 2026-11-15
kopsc git retime 2026-10-01 2026-10-15 --start-date 2026-11-01 --end-date 2026-11-15
```
### 时间怎么分配
@@ -39,29 +39,32 @@ kopsc git retime 2026-10-01 2026-10-15 --start-date 2026-11-01 --per-day 2 --day
- 如果某天提交太多、21:00–23:00 放不下所有间隔,会**自动压紧为窗口内均匀分布**,
预览表中该行标注「⚠ 已压缩间隔」。
### 重排日期(--start-date)
### 重排日期(--start-date / --end-date)
加 `--start-date <日期>` 后,范围内的提交按原顺序**重新分配日期**,从该日开始:
加 `--start-date` 后,范围内的提交按原顺序**重新分配日期**,均匀铺在
`[--start-date, --end-date]` 之间(不给 `--end-date` 时就只有起始那一天)。
```bash
kopsc git retime 2026-10-01 2026-10-15 --start-date 2026-11-01 # 每天一个,连续日期
kopsc git retime 2026-10-01 2026-10-15 --start-date 2026-11-01 --per-day 3 # 每天最多 3 个
kopsc git retime 2026-10-01 2026-10-15 --start-date 2026-11-01 --day-gap 2 # 日期间隔 2 天
kopsc git retime 2026-10-01 2026-10-15 --start-date 2026-11-01 # 全部集中在 11-01
kopsc git retime 2026-10-01 2026-10-15 --start-date 2026-11-01 --end-date 2026-11-15 # 铺满 15 天
```
```text
窗口: 21:00-23:00(从 2026-11-15 起重排,每天 1 个,间隔 2 天)
窗口: 21:00-23:00(在 2026-11-01 至 2026-11-15 之间均匀分布)
提交 原时间 新时间 主题
f89cdd9 2026-10-01 01:00:00 2026-11-15 21:09:21 c1
e06e019 2026-10-01 02:00:00 2026-11-17 21:03:30 c2
99f29b6 2026-10-01 03:00:00 2026-11-19 21:03:20 c3
f89cdd9 2026-10-01 01:00:00 2026-11-01 21:18:12 c1
e06e019 2026-10-01 02:00:00 2026-11-03 21:09:49 c2
99f29b6 2026-10-01 03:00:00 2026-11-06 21:13:52 c3
f25f7c3 2026-10-01 04:00:00 2026-11-08 21:06:54 c4
8abca35 2026-10-01 05:00:00 2026-11-11 21:02:31 c5
bea6552 2026-10-01 06:00:00 2026-11-13 21:10:34 c6
```
- 不给 `--per-day` 时**每天一个**提交;给了则一天最多放这么多个,放满换到下一个日期。
- `--day-gap` 是相邻两个提交日期间隔的天数,默认 1(连续日期)。
- 重排后每条提交仍落在该日的 21:00–23:00 内,同日多条严格递增。
- `--per-day` / `--day-gap` 必须配合 `--start-date`,否则报错提示。
- **按比例铺开**:第 i 个提交(从 0 开始)落在第 `i × 天数 ÷ 提交数` 天。
提交远少于天数时也是均匀铺满区间,不会全部堆在第一天。
- 同一天放多个提交时,它们仍按顺序落在该日 21:00–23:00 之间,严格递增。
- `--end-date` 必须配合 `--start-date`,且不能早于 `--start-date`。
### 预览示例
@@ -106,9 +109,8 @@ git reset --hard refs/kopsc-backup/main-20261101-093000
| `--seed N` | 随机种子,同一批提交用同一种子得到相同结果 |
| `--remote <名称>` | 强推到哪个远程,默认取唯一远程 |
| `--branch <名称>` | 改写的分支,默认当前分支 |
| `--start-date <YYYY-MM-DD>` | 重排日期:从该日起按顺序重新分配提交日期(默认保留原日期) |
| `--per-day N` | 重排时每天最多放 N 个提交,默认 1;需配合 `--start-date` |
| `--day-gap N` | 重排时相邻提交日期间隔 N 天,默认 1;需配合 `--start-date` |
| `--start-date <YYYY-MM-DD>` | 重排日期的起始日(默认保留每个提交的原日期) |
| `--end-date <YYYY-MM-DD>` | 重排的截止日期,提交均匀分布到 `[--start-date, --end-date]`;不给则只用起始那一天 |
| `--no-push` | 只改写本地,不推送 |
| `-y`, `--yes` | 确认执行(没有它只预览) |