English | 中文
git-workspace 是一个 git 多仓库工作区管理工具。在一份 YAML 里声明所有仓库, 一条命令即可把它们装配成一棵真实的工程目录树 —— 全部由真实的 git worktree 构成,没有任何 symlink。用 IDE 打开根目录,照常开发、构建、调试。
- 📄 一份声明式配置 ——
git-workspace.yaml描述每个仓库:地址、版本、装配位置 - 🌲 真实目录树 —— 由 git worktree 装配而成,IDE、pnpm、maven、docker 看到的都是真实路径
- 🔍 稀疏检出 ——
include/exclude过滤器,只取需要的内容 - 🔒 只读依赖 —— 三方代码在文件系统级锁定,唯一写入者只有
sync - 📌 可复现 —— lock 文件钉死精确 commit SHA,
sync --locked精确复现(适合 CI) - 🛡 提交防护 —— pre-commit 钩子防止三方代码误提交进你的仓库
- 🚀 自我更新 ——
git-workspace update一键升级到最新发布版本
依赖:Python 3.8+、git、PyYAML(安装脚本会自动检查并安装 PyYAML)。 独立安装始终钉住最新的发布 tag,而不是开发分支。
Linux / macOS / Git Bash:
curl -fsSL https://raw.githubusercontent.com/codingapi/git-workspace/main/install.sh | shWindows(PowerShell):
iex "& { $(irm https://raw.githubusercontent.com/codingapi/git-workspace/main/install.ps1) }"从克隆安装:./install.sh(--prefix DIR 可覆盖默认的 ~/.local)。
mkdir my-project && cd my-project && git init
git-workspace init # 创建 git-workspace.yaml + 提交防护钩子
# 编辑 git-workspace.yaml,声明你的仓库
git-workspace sync # 拉取全部源,装配出工程树一份最小配置:
version: 1
sources:
my-backend:
url: git@github.com:example/my-backend.git
revision: main
path: my-backend # 装配位置(可嵌套,如 my-backend/web)
my-lib:
url: git@github.com:example/my-lib.git
revision: v1.0.0
path: libs/my-lib
include: [core] # 只检出 core/
readonly: true # 文件系统级只读锁定之后直接在装配好的目录树里开发。任何你没有声明的目录(如
app/)都会被外层 git 仓库照常跟踪 —— 不需要手工配置任何 .gitignore。
本仓库自带一个可运行的示例:cp example.yaml git-workspace.yaml && git-workspace sync,会装配一个后端仓库、一个嵌套的前端仓库,以及同一个三方库
的两份过滤后只读检出。
Linux / macOS / Git Bash:
curl -fsSL https://raw.githubusercontent.com/codingapi/git-workspace/main/install.sh | sh -s -- --uninstallWindows(PowerShell):
iex "& { $(irm https://raw.githubusercontent.com/codingapi/git-workspace/main/install.ps1) } -Uninstall"从克隆安装的?重新执行 ./install.sh --uninstall。
如需同时清掉某个工作区的 worktree 与缓存:先执行 git-workspace clean --all。
| 指令 | 说明 |
|---|---|
git-workspace init |
在当前目录创建初始配置 + 提交防护钩子 |
git-workspace sync |
拉取全部源、物化 worktree、刷新 lock |
git-workspace sync --locked |
精确检出 lock 中的 SHA;要求配置与 lock 一致;不重写 lock(CI) |
git-workspace status |
查看各源 SHA、dirty 状态、检出过滤、只读状态 |
git-workspace outdated |
检查 lock 漂移与上游新 tag |
git-workspace verify |
CI 门禁:lock 存在且整棵树与之一致、所有源均干净时才通过(只读源还须已锁定) |
git-workspace update |
自我更新到最新发布版本 |
git-workspace clean [--all] |
拆除 worktree(--all 连同对象缓存一起清除) |
git-workspace version |
打印版本(也支持 -V / --version) |
git-workspace guard 由 pre-commit 钩子调用,一般不用手动执行。
Makefile 包装了常用指令(make sync、make status、make install 等)。
git-workspace.yaml ──▶ 引擎 ──▶ .workspace/git-cache/ (镜像克隆,按 URL 共享)
│ │
▼ ▼
git-workspace.lock.yaml 各装配位置上的真实 worktree
+ 托管 git 过滤块 & pre-commit 钩子
- 引擎 ——
git-workspace本体:单文件 Python CLI(约 850 行),只依赖 git 与 PyYAML。它解析配置、编排顺序,所有重活(mirror clone、worktree、 sparse-checkout、版本解析)全部委托给 git 原生能力。 - 两种仓库角色 —— 开发型仓库全量检出、可编辑,构成你的工程本体;
消费型依赖配检出过滤 + 文件系统级只读锁,唯一写入者是本工具——
sync会拒绝在已被改动的只读源上运行,verify也会标记它。 该锁是防误操作的护栏(POSIX 权限位;Windows 上为只读文件属性), 并非安全边界——CI 若要防篡改,请改用只读挂载与只读凭证。 - 镜像缓存 ——
.workspace/git-cache/下的 bare 克隆,按 URL 键控; 同一仓库的多个源共享同一个对象库,绝不重复下载。 - lock 文件 ——
sync将每个 revision 解析为 SHA 并写入git-workspace.lock.yaml。提交入库后,任何人(或 CI)用sync --locked精确复现整棵树:该模式直接检出 lock 中的 SHA (忽略main这类浮动 revision 的上游推进),要求配置的 source 集合、url、revision与 lock 一致,且绝不重写 lock。verify是其 CI 门禁: 仅当 lock 存在且格式正确、配置与 lock 一致、每个源都已按 lock SHA 物化 且工作树干净时才通过(只读源还须文件系统级锁定)。 - 工作区根发现 —— CLI 从当前目录逐级向上查找
git-workspace.yaml, 因此无论是全局安装还是从克隆直接运行,行为完全一致。 - 托管 git 过滤 —— 每次 sync 整体重写各仓库 exclude 文件中的标记块 (自我修复):装配路径被外层仓库忽略,未声明的内容照常跟踪。
- 安全性 —— 有未提交改动或本地提交时,sync 拒绝覆盖;
guard钩子 拦截强加装配目录或嵌入式 git 仓库进外层仓库的提交。 - 发布通道 —— 安装脚本钉住最新发布 tag,
git-workspace update与本地版本对比后就地升级。
开发只需 Python 3、PyYAML 和 git —— 直接从克隆运行 CLI:
git clone git@github.com:codingapi/git-workspace.git && cd git-workspace
./git-workspace -h
# 用自带示例做端到端冒烟测试:
cp example.yaml git-workspace.yaml && ./git-workspace sync && ./git-workspace status && ./git-workspace verify
./git-workspace clean --all && rm git-workspace.yaml git-workspace.lock.yaml约定:
- 保持单文件设计 —— 整个引擎就是
git-workspace,无构建步骤,只用标准库 + PyYAML。 - 保持声明式 —— 新能力应体现在
git-workspace.yaml里,而不是堆命令行参数。 - 提交 PR 前跑回归测试:
python -m unittest discover -s tests -v(需要 git + PyYAML)。CI 通过.github/workflows/ci.yml在 Linux、macOS、Windows 上运行。 - 发版流程:升级
__version__→ 提交 →git tag v<version>→ 推送 tag,安装脚本与update会自动感知。
注意:v0.4.0 起,镜像缓存目录名加入了源 URL 的短哈希(因此不同 URL 绝不 会共用缓存)。升级后每个源会重新克隆一次,旧缓存目录会遗留,可用
git-workspace clean --all清除。
Issue 与 Pull Request:https://github.com/codingapi/git-workspace