git worktree 是唯一能真正实现物理隔离的原生方案,因其为每个工作树提供独立的工作目录、索引和 head,共享对象库但文件系统完全分离,避免了 submodule、sparse checkout 等逻辑隔离方式的误操作风险。

git worktree 是唯一能真正实现物理隔离的原生方案,其他所谓“隔离”(如 submodule、sparse checkout、subtree)本质仍是同一工作区内的逻辑划分,无法防止误操作污染主分支。
为什么 git worktree 是物理隔离的唯一可靠选择
多个 git worktree 目录各自拥有独立的 .git 文件(指向主仓库 .git 的 gitdir),但共享同一对象数据库和 refs。关键在于:每个工作树有自己独立的 HEAD、索引(index)和工作目录文件,修改、提交、检出互不干扰。
常见误解是认为 submodule 能隔离——但它只是引用外部仓库的 commit,子模块目录本身仍是普通 Git 工作区,仍可直接 git push 或 git commit,且父仓库无法控制其权限边界;sparse checkout 仅控制文件可见性,所有分支历史仍可随意切换、强制推送。
-
git worktree下任意目录执行git status只反映该目录当前分支状态,不会意外覆盖其他分支的暂存区 - 敏感业务代码放在
../biz-core工作树,基础库代码放在../lib-shared工作树,两个路径完全无文件系统交集 - 即使在
../biz-core中误执行git push origin main,只要远程main分支受保护(见下节),也不会成功——但至少本地不会混入基础库代码
如何用 git worktree 配合受保护分支锁死推送路径
物理隔离解决的是“本地误操作”,而远程分支保护解决的是“绕过本地流程的直推”。二者必须组合使用,否则隔离形同虚设。
以 GitHub / GitLab 为例,对 main 和 release/* 分支启用完整保护:
生成周报:读取本机 Git 仓库最近一周的提交记录,按项目分类提炼总结,生成标准周报格式,通过微信推送并返回给用户。触发词:周报、weekly report、git总结、提交记录总结、工作周报。
- 勾选 “Require pull request reviews before merging” 并设置最少 2 名批准者
- 启用 “Include administrators” —— 管理员也不能绕过规则
- 开启 “Require status checks to pass before merging”,绑定 CI 流水线(如单元测试、静态扫描)
- 禁用 “Allow force pushes” 和 “Allow deletions”
- 若使用 GitLab,额外配置 “Protected Branches > Allowed to merge” 仅限
dev组,禁止ops或biz组直接推送
注意:git worktree add 创建的工作树默认仍可向远程推送——保护必须靠服务端策略,而非本地命令限制。
git worktree 实操中三个易踩的坑
不是所有路径都能无脑挂载,也不是所有操作都安全。
- 不能在已有 Git 仓库内创建新工作树:
git worktree add ../existing-repo feature/x会失败,提示 “working tree is not empty” —— 必须确保目标路径为空或根本不存在 - 删除工作树前必须先
git worktree remove <path></path>,否则git worktree prune会误删未注册的目录(比如你手动rm -rf后忘记 remove) -
git stash在工作树中不可跨树共享——../biz-core的 stash 不会出现在../lib-shared中,也不能用git stash pop从一个工作树恢复另一个的暂存变更
敏感代码与基础库共用同一仓库时的最小权限设计
如果业务代码和基础库必须放在同一个仓库(例如 monorepo 场景),git worktree 仍有效,但需配合路径级权限控制:
- 在 CI 脚本中用
git diff --name-only HEAD~1 HEAD检查本次提交是否只修改了libs/目录下的文件,否则拒绝构建 - 在 pre-commit hook 中禁止向
biz/目录写入未签名的 commit(可用 GPG 或内部 token 校验) - GitLab 支持
Push Rules:正则匹配^biz/.*路径的推送,仅允许来自特定 CI job 的 token,拒绝所有个人 SSH/HTTPS 推送
真正的隔离不在工具层,而在规则落地——git worktree 提供了干净的执行环境,但谁能在哪个目录提交、由谁触发合并、何时允许发布,这些决策点必须嵌入到流程里,而不是靠人肉自律。










