- 新增 --end-date:提交按比例铺满 [start-date, end-date],第 i 个提交 落在第 i×天数÷提交数 天,提交远少于天数时也不会堆在第一天 - 移除 --per-day / --day-gap:原先的“每天一个、日期顺延”语义不直观 - 只给 --start-date 时集中在该日;--end-date 需配合 --start-date 且不早于它 - 同一天的多条提交仍按顺序落在 21:00-23:00 之间 - 文档与预览文案同步为区间语义
123 lines
5.8 KiB
Markdown
123 lines
5.8 KiB
Markdown
# Git 历史(`kopsc git <子命令>`)
|
||
|
||
> 返回 [README.md](README.md)
|
||
|
||
按日期范围批量调整提交时间,然后强推。用于把一批提交的时分秒统一挪到某个时间段。
|
||
|
||
```bash
|
||
kopsc git retime 2026-10-01 2026-10-15 # 预览:会改哪些提交、改成什么时间
|
||
kopsc git retime 2026-10-01 2026-10-15 --yes # 确认后真正改写并强推
|
||
```
|
||
|
||
> ⚠️ **这会改写历史并强推**,提交 SHA 会全部变化。默认只预览、不改任何东西,必须显式加 `--yes` 才会执行。
|
||
|
||
## 改写提交时间(git.retime)
|
||
|
||
`kopsc git retime <开始日期> <结束日期> [选项]` 把该日期范围内(含两端)的提交,
|
||
**保留各自的原日期**,只把时分秒重排到 **21:00–23:00** 之间,然后 `git push --force-with-lease`。
|
||
|
||
```bash
|
||
kopsc git retime 2026-10-01 2026-10-15 # 默认窗口 21:00-23:00
|
||
kopsc git retime 2026-10-01 2026-10-15 --interval 10-25 # 间隔改为 10-25 分钟
|
||
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 至 2026-11-15
|
||
kopsc git retime 2026-10-01 2026-10-15 --start-date 2026-11-01 --end-date 2026-11-15
|
||
```
|
||
|
||
### 时间怎么分配
|
||
|
||
默认**保留每个提交的原日期**,只改时分秒;加 `--start-date` 才会重排日期(见下)。
|
||
|
||
- 每个提交落在**自己原来的日期**上,日期不变。
|
||
- 同一天内的提交按原顺序**严格递增**。
|
||
- 相邻提交间隔是 **5–40 分钟**的随机值,**秒位也随机**(如 `21:07:43` → `21:32:11`),
|
||
与真实手工提交一致,不会出现整齐的 `:00` 秒。
|
||
- 当天第一条提交在 21:00–21:20 之间随机开始。
|
||
- 如果某天提交太多、21:00–23:00 放不下所有间隔,会**自动压紧为窗口内均匀分布**,
|
||
预览表中该行标注「⚠ 已压缩间隔」。
|
||
|
||
### 重排日期(--start-date / --end-date)
|
||
|
||
加 `--start-date` 后,范围内的提交按原顺序**重新分配日期**,均匀铺在
|
||
`[--start-date, --end-date]` 之间(不给 `--end-date` 时就只有起始那一天)。
|
||
|
||
```bash
|
||
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-01 至 2026-11-15 之间均匀分布)
|
||
|
||
提交 原时间 新时间 主题
|
||
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
|
||
```
|
||
|
||
- **按比例铺开**:第 i 个提交(从 0 开始)落在第 `i × 天数 ÷ 提交数` 天。
|
||
提交远少于天数时也是均匀铺满区间,不会全部堆在第一天。
|
||
- 同一天放多个提交时,它们仍按顺序落在该日 21:00–23:00 之间,严格递增。
|
||
- `--end-date` 必须配合 `--start-date`,且不能早于 `--start-date`。
|
||
|
||
### 预览示例
|
||
|
||
```text
|
||
改写: 2 个提交(分支 main,远程 origin)
|
||
强推: 是 --force-with-lease → origin/main
|
||
目标: origin/main
|
||
窗口: 21:00-23:00(保留原日期)
|
||
|
||
提交 原时间 新时间 主题
|
||
1111111 2026-10-01 10:00:00 21:13:12 feat: 初始提交
|
||
2222222 2026-10-01 22:10:00 21:25:03 docs: 补充说明
|
||
```
|
||
|
||
无 `--yes` 时输出预览并**以退出码 2 结束**,不修改任何东西。范围内没有提交时正常退出。
|
||
|
||
### 安全措施
|
||
|
||
| 措施 | 说明 |
|
||
| --- | --- |
|
||
| 默认只预览 | 不加 `--yes` 不碰仓库 |
|
||
| 工作区检查 | 有未提交改动时直接拒绝(先 `git stash` 或提交) |
|
||
| 自动备份 | 改写前创建 `refs/kopsc-backup/<分支>-<时间戳>` 指向原提交 |
|
||
| 内容校验 | 推送前比对新旧提交的 tree 哈希,内容不一致则中止 |
|
||
| 租约强推 | 只用 `--force-with-lease`,绝不覆盖远程上本地未知的新提交 |
|
||
|
||
回滚(本地):命令结束时也会打印这行
|
||
|
||
```bash
|
||
git update-ref refs/heads/main refs/kopsc-backup/main-20261101-093000
|
||
# 或
|
||
git reset --hard refs/kopsc-backup/main-20261101-093000
|
||
```
|
||
|
||
### 选项
|
||
|
||
| 选项 | 说明 |
|
||
| --- | --- |
|
||
| `<开始日期> <结束日期>` | 必填,格式 `YYYY-MM-DD`,含两端 |
|
||
| `--window HH:MM-HH:MM` | 时间窗口,默认 `21:00-23:00`(`--since` / `--until` 为等价别名) |
|
||
| `--interval 5-40` | 相邻提交间隔(分钟),默认 5-40;也可写 `--interval match-remote` 参照远程分支的间隔 |
|
||
| `--seed N` | 随机种子,同一批提交用同一种子得到相同结果 |
|
||
| `--remote <名称>` | 强推到哪个远程,默认取唯一远程 |
|
||
| `--branch <名称>` | 改写的分支,默认当前分支 |
|
||
| `--start-date <YYYY-MM-DD>` | 重排日期的起始日(默认保留每个提交的原日期) |
|
||
| `--end-date <YYYY-MM-DD>` | 重排的截止日期,提交均匀分布到 `[--start-date, --end-date]`;不给则只用起始那一天 |
|
||
| `--no-push` | 只改写本地,不推送 |
|
||
| `-y`, `--yes` | 确认执行(没有它只预览) |
|
||
|
||
### 注意事项
|
||
|
||
- **强推会影响协作者**:其他人本地历史会与远程分叉,需要重新拉取。
|
||
- 仓库若开启**分支保护**,强推会被拒绝。此时**本地历史已经改写**,请用上面的备份引用回滚。
|
||
- 只处理**本地**已有提交;尚未推送的提交同样适用(`--no-push` 只改本地)。
|
||
- 页面显示的是**作者时间**,命令会同时改写作者时间与提交时间,避免两者矛盾。
|