repostack snapshot

将当前 stack 的 Git 状态写入 repostack.lock.yaml

repostack snapshot

执行流程

加载配置
  • 读取 repostack.yaml.repostackrc(如果启用了用户配置)。

读取每个 repo 的 Git 状态
  • 对每个 repo 执行:
    • git rev-parse --abbrev-ref HEAD → 分支
    • git rev-parse HEAD → revision
  • 如果 repo 是空仓库(无 commit),上述命令失败,会被捕获并记录为 "(no commits)"

构建 lock 对象
  • 结构如下:
    version: 1
    checksum: abc123...
    repos:
      foo:
        path: foo
        source: ./foo
        branch: main
        revision: a79cd2d...
    

计算校验和
  • 将 lock 对象去掉 checksum 字段后按固定键序序列化为 JSON,计算 SHA-256,取前 16 位作为 checksum
  • 该校验和用于 sync 时检测 lock 文件是否被意外修改。

写入文件
  • 使用 YAML 格式覆盖写入 repostack.lock.yaml

涉及文件

文件操作
repostack.yaml读取
.repostackrc读取
repostack.lock.yaml写入(覆盖)

Git 操作

  • git rev-parse --abbrev-ref HEAD(每个 repo)
  • git rev-parse HEAD(每个 repo)

错误与边界情况

  • 配置加载失败会直接中断命令。
  • 文件写入错误会直接抛出。
  • 空仓库的分支和 revision 会被记录为字符串 "(no commits)"

适用场景

  • 完成一组 repo 的版本调整后记录状态
  • 在重要变更前创建"检查点"
  • 准备提交 stack 状态到版本控制

注意

  • useremove 命令在修改配置后会自动生成 snapshot
  • sync 命令在同步完成后也会自动重新生成 snapshot。
  • 因此,通常只有在手动调整 repo 状态后、想立即固化状态时才需要手动运行 repostack snapshot

示例

repostack snapshot