`quicommit ginit`(别名 `gi`)离线完成仓库起步:用 git2 建库并确立初始分支、 写最简 README.md、按根目录标志文件装配 .gitignore、按 --add 添加远程, `--profile` 可选套用已有 Git 配置。在已有仓库上重复执行只补齐缺失项:绝不覆盖 既有的 README.md/.gitignore、绝不改动已有 remote 的地址、不提供 --force、 不创建首个提交。边界取舍见 ADR 0006,命令命名见 ADR 0005。 实现落在新的 src/git/init.rs(9 个 git 层函数)与 src/commands/ginit.rs, 命令层不直接引用 git2,GitRepo 公开接口未改动,其余命令行为不变。 测试:src/git/init.rs 11 条单元测试、tests/ginit_tests.rs 18 条集成测试; 新增 35 个 ginit_* 消息覆盖 7 种语言。 另将 CONTEXT.md 与 docs/adr/ 纳入版本跟踪(.gitignore 放开 adr/ 与 CONTEXT.md 两条忽略规则);RAODMAP.md 除 ginit 条目外还包含此前未提交的 规划条目更新。
2.5 KiB
ginit prepares a repository and stops there
quicommit ginit writes .git, an Initial branch, README.md, .gitignore and Remote entries — and deliberately does not: create a first commit, apply a Git Profile unless --profile is passed, append anything to a pre-existing README.md or .gitignore, reuse QuiCommit's own root .gitignore as the template, contact a hosting API to create a remote repository, verify remote reachability, or set upstream tracking. Each of these was within reach and would have made the command look more capable, but all of them either destroy the property that makes ginit safe to run anywhere ("it only ever adds, never overwrites or deletes") or would silently pull the LLM pipeline, the network, and credential scopes into a command whose whole job is offline repo scaffolding. There is also no --force: git init is already idempotent on an existing repository, so the only thing --force could mean is deleting .git.
Considered Options: commit README.md + .gitignore as chore: initial commit (rejected — the user's week-old source files stay untracked, producing a repository that looks complete but is missing files, and it couples a local-only command to commit identity and message generation); apply default_profile automatically (rejected — it would rewrite signing keys and core.sshCommand in a repo the user did not ask us to configure, so the intent must be explicit); merge missing entries into an existing .gitignore (rejected — deciding whether target/ is already covered means string-matching /target, **/target/, and directory rules, and a wrong match writes into a file the user maintains by hand); seed the template from the repository's own .gitignore (rejected — it carries QuiCommit-specific development artifacts: it ignores Cargo.lock, config.toml, CONTEXT.md, adr/, .claude/, plus # OS and # IDE sections that the roadmap entry explicitly rules out).
Consequences: after ginit, the first commit is still the user's action via quicommit commit, so ginit must print next-step guidance and must warn when no user.name/user.email can be resolved from either the repository or global config — otherwise the very next command fails with an error the user will blame on ginit. Users who want .gitignore entries added to an existing file must edit it themselves. Repo-creation capability lives in a new src/git/init.rs rather than on GitRepo, whose open diagnostic chain is built for repositories that already exist.