git不支持环境变量切换,因命令不读取shell变量;可靠方案是pyenv local配合.pre-commit-config.yaml自动加载.env,或用git worktree为各分支创建物理隔离目录并独立配置.env文件。

Git 本身不提供“环境变量切换工具”,多分支并发测试时真正需要的,是能随分支自动加载对应配置、且不污染全局状态的机制。硬靠 GIT_ENV 或自定义 shell 环境变量去切换,不仅不可靠,还极易引发冲突或漏切。
为什么不能用普通 shell 环境变量管理 Git 多分支测试
Git 命令(如 git checkout、git merge)不读取你设的 ENV_NAME=staging 这类变量;它们只依赖 .git/ 下的元数据和本地配置。你在终端里 export 的变量,对 Git 内部逻辑完全透明,只影响你后续手动写的脚本——但这些脚本一旦并行执行,变量就互相覆盖。
-
GIT_DIR和GIT_WORK_TREE是 Git 自己用的底层变量,改错会导致命令直接失败(比如报fatal: not a git repository) - 用
export ENV=dev && npm test这种方式,在 CI 或多终端测试中无法保证环境隔离 - 分支切换后,shell 变量不会自动更新,必须手动重设,极易遗漏
真正有效的方案:用 pyenv + .python-version + pre-commit 钩子
如果你的测试逻辑依赖 Python 环境(比如 pytest + requests 调不同 API 地址),pyenv local 是目前最轻量、最可靠、且天然支持 Git 分支粒度的方案。
- 每个分支在根目录放一个
.python-version文件,内容如3.11.9 - 再配一个
.env文件(不提交),存API_BASE_URL=https://staging.example.com,由测试脚本读取 - 用
pre-commit钩子在git checkout后自动 reload.env:在.pre-commit-config.yaml中加一条repo: local规则,调用source .env && echo "Loaded env for $(git rev-parse --abbrev-ref HEAD)" - 注意:
.env必须加进.gitignore,否则会误提交敏感值
更通用的替代:Git worktree + 独立 .env 文件
当测试需要同时跑多个分支(比如 feature/A 和 hotfix/B 并行验证),git worktree 比 git checkout 更安全,因为它为每个分支创建物理隔离目录,天然支持各自独立的环境配置文件。
- 执行
git worktree add ../myapp-staging staging,会在新目录里生成完整工作树 - 在
../myapp-staging/.env里写BASE_URL=https://staging.api,在../myapp-prod/.env里写BASE_URL=https://prod.api - 测试脚本统一读
os.getenv("BASE_URL"),无需改代码 - 删除分支时,记得同步删掉对应 worktree 目录和其中的
.env,避免残留
复杂点在于:所有测试脚本必须显式加载 .env,不能依赖 shell 全局变量;而最容易被忽略的是,git worktree remove 不会自动清理里面的 .env,得靠人工或 CI 清理脚本兜底。











