Document how to run the proxy as an independent project and keep generated runtime state out of version control. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
3.2 KiB
3.2 KiB
host-git-cred-proxy
让 Docker 容器复用宿主机现有的 Git HTTPS 凭证。
适用场景:
- macOS + OrbStack / Docker Desktop
- 容器里使用
https://...Git remote - 宿主机已经能通过自己的
git credential正常取到凭证
工作方式:
- 宿主机启动一个只监听
127.0.0.1的代理服务 - 代理服务内部调用宿主机自己的
git credential fill/approve/reject - 容器里的 Git helper 把 Git 的凭证请求转发到宿主机代理
这意味着它代理的是“宿主机 Git 当前能取到的 HTTPS 凭证”,不是 macOS 全部系统密码。
文件
start.sh:在宿主机后台启动代理stop.sh:停止代理status.sh:查看状态server.mjs:宿主机 HTTP 代理服务git-credential-hostproxy:容器里给 Git 用的 helper 入口helper.mjs:容器 helper 实现configure-container.sh:在容器里写入 Git 配置
默认行为
- 默认代理所有
httpsGit 凭证 - 默认监听
127.0.0.1:18765 - 容器默认通过
http://host.docker.internal:18765访问宿主机 - token 生成到
./state/token
如果你还要代理 http 仓库:
GIT_CRED_PROXY_PROTOCOLS=https,http ./start.sh
使用
1. 宿主机启动代理
在宿主机进入这个项目目录:
./start.sh
查看状态:
./status.sh
2. 确保容器能访问这个项目目录
容器里的 Git helper 会直接引用这个项目目录下的脚本和 state/token。
所以你需要保证这个目录也能在容器里看到,例如:
- 宿主机和容器都共享
/workspaces - 或者把这个目录单独挂载到容器内
3. 容器里配置 Git helper
全局生效:
/workspaces/host-git-cred-proxy/configure-container.sh
只作用于当前仓库:
cd /path/to/your/repo
/workspaces/host-git-cred-proxy/configure-container.sh --local
或者显式指定仓库:
/workspaces/host-git-cred-proxy/configure-container.sh --local --repo /workspaces/your-repo
4. 验证
git ls-remote origin
或者:
printf 'protocol=https\nhost=example.com\npath=owner/repo.git\n\n' | git credential fill
可选环境变量
GIT_CRED_PROXY_HOST:宿主机监听地址,默认127.0.0.1GIT_CRED_PROXY_PORT:宿主机监听端口,默认18765GIT_CRED_PROXY_PUBLIC_URL:容器访问地址,默认http://host.docker.internal:<port>GIT_CRED_PROXY_PROTOCOLS:允许代理的协议列表,默认httpsGIT_CRED_PROXY_ALLOWED_HOSTS:可选,限制允许代理的 host,逗号分隔GIT_CRED_PROXY_URL:容器 helper 访问代理的地址,默认http://host.docker.internal:18765GIT_CRED_PROXY_TOKEN:可选,直接传 token,优先于 token 文件GIT_CRED_PROXY_TOKEN_FILE:可选,自定义 token 文件路径GIT_CRED_PROXY_RUNTIME:可选,显式指定bun或node
安全说明
- 服务端默认只监听
127.0.0.1 - token 存在项目目录下,并通过
.gitignore忽略 - 只要容器能读取这个目录,也就能读取 token
- 这适合你信任当前容器的开发场景,不适合不可信容器或多租户环境
停止代理
./stop.sh