mise bootstrap repos在 mise.toml 中声明式管理 Git 仓库克隆与更新【免费下载链接】misedev tools, env vars, task runner项目地址: https://gitcode.com/GitHub_Trending/mi/misemise 的 bootstrap 系统可以在[bootstrap.repos]配置块中声明 Git 仓库的克隆位置、远端地址与目标 ref并通过mise bootstrap repos子命令族status/apply/update/exec实现声明式收敛、安全更新与批量命令执行。本文以 docs/bootstrap/repos.md 为主线结合仓库源码src/system/repos.rs、src/cli/system/install.rs、src/cli/bootstrap.rs讲解配置语法、路径规则、各命令的实战用法、仓库状态模型以及安全更新、绝不覆盖本地工作的核心设计哲学。[bootstrap.repos]配置语法在任意 mise 配置文件如项目根目录的mise.toml、~/.config/mise/config.toml中声明[bootstrap.repos] ~/src/dotfiles { url gitgithub.com:jdx/dotfiles.git, ref main } ~/src/mise { url https://github.com/jdx/mise.git }key仓库克隆的目标路径url必填Git 远端地址支持 ssh、https 等常见形式ref可选分支名、tag 或完整 commit SHA用于固定检出版本。这些声明不会在加载配置时生效必须通过显式命令应用。对应的 TOML 解析结构见源码 RepoTomlConfigurl与git_ref字段校验逻辑位于 RepoRequest::from_tomlurl不能为空、不能以-开头防止被误解析为命令行选项ref同样不能为空或以-开头。目标路径的三种写法写法解析方式适用场景绝对路径原样使用任意配置文件~/开头展开为用户主目录任意配置文件相对路径相对声明它的配置文件的项目根目录解析仅限项目配置源码 RepoRequest::from_toml 详细实现了相对路径校验相对路径必须位于项目根目录之内——不能为空或.不能包含..、绝对路径段或 Windows 盘符前缀实际解析时只拼接Normal段因此./foobar会干净地解析为root/foobar而非root/./foobar。若在全局配置如~/.config/mise/config.toml中写相对路径由于没有项目根可供解析会直接报错relative repo paths are only allowed in a project config; use an absolute path or a ~/ path跨配置文件的合并语义[bootstrap.repos]遵循 mise 的配置层级加载所有配置文件后按全局 → 本地的顺序合并以展开后的目标路径为 key——更本地的配置会完整替换同路径的整个条目而非逐字段合并。无效条目会告警并跳过。实现见 repos_from_config// config_files is ordered local - global; reverse for global - local for cf in config.config_files.values().rev() { for (path_raw, repo) in sys.repos { match RepoRequest::from_toml(path_raw.clone(), repo, cf.project_root().as_deref()) { Ok(request) { merged.insert(request.path.clone(), request); } Err(err) warn!([bootstrap.repos].\{path_raw}\: {err}), } } }这意味着你可以在全局配置中定义通用的仓库清单再在某个项目里针对同一路径覆盖 url 或 ref。四条命令的实战用法命令族定义在 BootstrapRepos包含apply、update、exec、status四个子命令。status查看仓库收敛状态mise bootstrap repos status # 查看每个仓库的检出状态 mise bootstrap repos status --json # 输出机器可读的 JSON mise bootstrap repos status --missing # 存在未收敛仓库时以退出码 1 结束--json输出每个仓库的path、path_raw、url、ref、origin、current_ref、current_sha、state、reason字段适合脚本化巡检实现见 BootstrapReposStatus::run--missing用于 CI 或 hook只要有任何仓库不是current状态即返回退出码 1实现中通过if !s.state.is_current() { any_missing true; }累积判断。apply建立声明好的检出mise bootstrap repos apply # 克隆缺失仓库、收敛到声明 ref mise bootstrap repos apply --dry-run # 只打印将要执行的命令不真正运行 mise bootstrap repos apply --yes # 跳过确认提示 mise bootstrap repos apply --skip-dirty # 跳过有本地改动的仓库apply是收敛型操作目标是对齐声明状态。对missing仓库执行git clone对differs干净但不在声明 ref 上的仓库执行git fetchgit checkout 按需git pull --ff-only见 apply_statuses 与 update_repo。未声明ref的已有仓库会被视为 current保持当前 commit 不动——apply 不会主动拉取。update拉取最新内容mise bootstrap repos update # 克隆缺失并 pull 已有仓库 mise bootstrap repos update ~/src/mise # 只更新匹配该路径的仓库 mise bootstrap repos update --dry-run # 只打印命令 mise bootstrap repos update --yes # 跳过确认 mise bootstrap repos update --skip-dirty # 跳过有本地改动的仓库与apply的关键区别在 update_statuses 和 update_repos对未声明ref的 current 仓库update会执行 fetch 并将当前分支 fast-forwardupdate_unpinned_repo对已声明ref的仓库update仍以声明的 ref 为目标不会脱离它去拉最新——ref是 apply 与 update 共同的靶心对处于 detached HEAD 且未固定 ref 的仓库会告警并跳过路径参数用于精确筛选源码 filter_repos 要求路径必须精确匹配配置中原始路径或展开后的路径否则报错no configured repo matched path: ...。exec在每个可用仓库中执行命令mise bootstrap repos exec -- git status # 在每个可用仓库运行 git status mise bootstrap repos exec ~/src/mise -- git pull # 只在该仓库运行 mise bootstrap repos exec --continue-on-error -- command mise bootstrap repos exec --dry-run -- commandexec的实现见 repos::exec命令通过Command::new(program).args(args).current_dir(repo_path)直接执行不经 shell 插值避免注入与引号问题missing与conflict状态的仓库会被跳过并告警默认遇到第一个失败即停止bail加--continue-on-error后遍历所有可用仓库最后统一报告失败列表--dry-run打印形如cd path command的合成命令命令必须在--之后--之前的位置参数用于筛选仓库路径。参数速查参数适用命令作用--dry-run/-napply、update、exec打印将执行的命令而不执行--yes/-yapply、update跳过交互确认提示--skip-dirtyapply、update跳过有本地改动的仓库警告并继续--continue-on-error/-cexec失败后继续访问其余仓库--json/-Jstatus输出 JSON--missingstatus有未收敛仓库时退出码为 1PATH...update、exec只处理匹配的路径交互确认的实现位于 mutate_repos非 dry-run、非--yes且终端有人工用户时会先列出目标仓库并询问确认用户拒绝则整批跳过。仓库状态模型status与各命令以统一的五态模型工作枚举定义于 RepoState状态判定逻辑在 status_one状态含义判定依据源码current仓库存在、origin 匹配、ref 匹配is_git_repo origin 匹配 工作区干净 ref_is_currentmissing目标路径不存在或为空目录路径不存在或非 git 目录但read_dir为空differs仓库干净但不在声明的 ref 上origin 匹配、工作区干净、但 ref 未对齐dirty仓库有本地改动或未跟踪文件git status --porcelainv1输出非空is_cleanconflict目标路径不是期望的 git 仓库路径是文件、非 git 目录或 origin 与配置不匹配ref_is_currentsrc/system/repos.rs#L440-L457支持三种对齐形式当前分支名等于 ref、当前 HEAD SHA 等于 ref即 ref 是完整 SHA、或 ref 对应的本地引用指向当前 HEAD同时会对照远端引用校验 head 是否与远端一致。核心语义安全第一的声明式设计无隐式写入仓库只会在显式的apply、update、exec或顶层mise bootstrap时被改动。status只读配置加载本身零副作用。apply 永远不会主动 pull 一个未声明 ref 的已有仓库。无强制重置绝不覆盖本地工作dirty 仓库、非空且非 git 的目标路径、origin 不匹配的目录都会直接失败而不是覆盖。preflight 校验见 preflight_statuses任何 dirty 或 conflict 都会整体终止。--skip-dirty则是先剔除 dirty 仓库保留其余再 preflight因此冲突依旧会先于任何变更失败——你不可能在收敛过程中意外丢掉本地改动。origin 匹配三种网络形式视为同一仓库mise 采用传输无关的比较以下三种形式指向同一个仓库githost:path ssh://githost/path https://host/path核心实现在 repo_identity 与 repo_identity_parts将 URL 归约为[user]host[:port]/path身份串只有显式用户ssh或约定俗成的git用户才参与比较ssh 省略用户时 git 会解析为登录用户而非git因此不归一化https 的 userinfo 被视为凭据而非仓库身份带用户名/密码的 https URL 直接返回None保持精确匹配其余形式一律精确匹配http://与git://保持独立不安全的传输绝不会被静默当作配置的 https 等价物、带 query/fragment 的 URL、本地路径与file://URL、显式端口、非git的 ssh 用户、不同的主机或路径都视为冲突比较前会统一去除末尾/并对https://、ssh://、scp 形式剥离.git后缀normalize_remote_url本地路径与 Windows 绝对路径不剥should_strip_git_suffix。省略ref的语义对已有且 origin 匹配的仓库未声明 ref 即视为 currentmise 不 fetch、不更新。想要拉最新的命令式行为请使用mise bootstrap repos update。在完整 bootstrap 流程中的位置顶层mise bootstrap的执行顺序源码 src/cli/bootstrap.rs 及模块注释为packagescompose→repos→ dotfiles → defaults → user → tools每个阶段前后都有 pre/post hooksPreRepos/PostRepos。这一编排使下面的链条成为可能[bootstrap.packages]先安装git[bootstrap.repos]克隆 dotfiles 仓库[dotfiles]从该检出应用配置文件。顶层命令会读取--skip-dirty并在 apply/update 之间选择加--update走 update_repos否则走 apply_repos。实践建议首次收敛用 applymise bootstrap repos apply --dry-run先预览全部将执行的git clone/git checkout/git pull --ff-only再正式执行日常拉新用 updatemise bootstrap repos update --skip-dirty在不触碰本地改动的前提下将未固定 ref 的仓库 fast-forwardCI 校验用 statusmise bootstrap repos status --missing以退出码表达是否全部收敛可直接接入检查脚本批量运维用 execmise bootstrap repos exec --continue-on-error -- git pull --ff-only遍历所有仓库并汇总失败固定版本用完整 SHA将ref写为完整 commit SHA 可实现可复现的检出apply 与 update 都会收敛到该 SHA前提条件系统需安装 git并能对每个配置的 origin 完成认证。若 dotfiles 源位于这些检出中请按完整 bootstrap 的顺序先 apply repos 再应用 dotfiles。相关实现与测试可继续阅读src/system/repos.rs状态机与 git 操作、src/system/mod.rs#L780-L801配置聚合、src/cli/system/install.rs#L238-L347apply/update 收敛流程、src/cli/bootstrap.rs#L966-L1056子命令定义。【免费下载链接】misedev tools, env vars, task runner项目地址: https://gitcode.com/GitHub_Trending/mi/mise创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
