ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

GitHub CLI 与 Codex 项目目录映射说明:把 auth.json 改到 TaoToken 的实操配置

GitHub CLI 与 Codex 项目目录映射说明:把 auth.json 改到 TaoToken 的实操配置 1. 为什么 Codex 工作目录里 gh pr status 总是报错如果你在 Windows 上用 GitHub CLI 配合 Codex 做日常开发大概率遇到过这个场景Codex 在C:\Users\你的用户名\Documents\Codex\某天\某个临时工作目录里跑任务你想顺手看一眼 PR 状态敲下gh pr status结果直接甩你一脸failed to run git: fatal: not a git repository (or any of the parent directories): .git这个报错的根因不复杂。gh pr status的原生逻辑是先调用git判断当前目录属于哪个仓库拿到owner/repo之后再去查 PR。而 Codex 的工作目录通常不是 Git 仓库——它只是一个临时工作区用来放生成的文件、脚本、中间产物。目录里没有.gitgit自然报not a git repositorygh也就没法继续。GitHub CLI 原生支持三种指定仓库的方式在真实 Git 仓库目录里运行、显式传-R owner/repo、通过环境变量GH_REPO指定。但这三种在 Codex 场景下都不顺手你不可能每次手动敲-R环境变量又是全局的切项目就乱。所以真正要解决的问题有两个一是让gh pr status在非 Git 目录里也能工作二是让「哪个项目目录对应哪个 GitHub 仓库」这件事有明确的、可维护的映射规则而不是靠记忆或者临时改环境变量。这篇就围绕 GitHub CLI 与 Codex 项目目录映射把auth.json改到 TaoToken 的实操配置、PowerShell 包装层、目录映射验证和gh pr status回归检查一次讲清楚。适合谁看在 Windows PowerShell 下用 GitHub CLI Codex 协同开发、被not a git repository反复打断、又想把模型请求统一走 TaoToken 的开发者。下面所有命令和配置都可以直接复制跟做。2. TaoToken 前置准备Base URL、Key 与 Codex 的 auth.json 位置在动 GitHub CLI 之前先把 Codex 侧的模型接入理顺。Codex 读取模型配置的核心文件是auth.jsonWindows 下通常位于C:\Users\你的用户名\.codex\auth.json如果你用的是较新的 Codex CLI配置也可能落在项目级或用户级的config.toml里但auth.json仍然是存放凭据和 Base URL 覆盖的关键文件。TaoToken 的 API 入口是https://taotoken.net/api注意这个地址不带任何查询参数是纯 API Base。你需要先在 TaoToken 控制台创建一个 API Key然后把它写进auth.json。一个最小可用的auth.json结构如下把sk-你的实际Key替换成控制台生成的 Key{ OPENAI_API_KEY: sk-你的实际Key, OPENAI_BASE_URL: https://taotoken.net/api }如果你用的是需要显式声明 provider 的版本可以写成带 provider 字段的形式{ providers: { taotoken: { api_key: sk-你的实际Key, base_url: https://taotoken.net/api } }, default_provider: taotoken }这里有个容易踩的坑auth.json是 JSON不能有注释、不能有尾逗号。很多人从文档里复制粘贴时带上了//注释Codex 启动时直接解析失败报reading choices之类的错。改完文件后建议用 PowerShell 校验一下Get-Content $env:USERPROFILE\.codex\auth.json -Raw | ConvertFrom-Json如果这条命令没报错说明 JSON 合法。如果报Invalid JSON primitive就回去检查逗号和引号。关于 Key 的获取和更多接入细节可以对照官方文档操作接入文档在https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdocAPI Key 管理页在https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentapi-keys。这两个页面分别解决「怎么配」和「Key 从哪来」的问题。配置完成后Codex 发出的模型请求就会走 TaoToken 的 Base URL而不是默认的官方端点。这一步和后面的 GitHub CLI 包装层是两件独立的事auth.json管的是模型请求往哪走PowerShell 包装层管的是gh pr status在哪个目录查哪个仓库。两者都配好Codex 在临时目录里既能正常调模型也能正常查 PR。3. 可复制配置PowerShell 包装层与目录映射 JSON这一节是全文的核心给出可以直接复制的配置片段。思路是不改gh.exe本体而是在 PowerShell profile 里加载一个同名函数gh拦截gh pr status根据当前目录是否 Git 仓库、是否有映射决定补不补-R owner/repo。先建包装脚本建议放在长期目录不要放 Codex 临时目录# C:\Tools\GitHubCliFallback.ps1 $script:GhRepoMapFile Join-Path $env:APPDATA GitHub CLI\codex-project-repos.json function Get-GhRepoMap { if (Test-Path -LiteralPath $script:GhRepoMapFile) { return Get-Content -LiteralPath $script:GhRepoMapFile -Raw | ConvertFrom-Json } return {} } function Save-GhRepoMap($map) { $dir Split-Path -Parent $script:GhRepoMapFile if (-not (Test-Path -LiteralPath $dir)) { New-Item -ItemType Directory -Force -Path $dir | Out-Null } $map | ConvertTo-Json -Depth 5 | Set-Content -LiteralPath $script:GhRepoMapFile -Encoding UTF8 } function Set-GhProjectRepo { param( [Parameter(Mandatory$true)][string]$ProjectPath, [Parameter(Mandatory$true)][string]$Repository ) $map Get-GhRepoMap $key (Resolve-Path -LiteralPath $ProjectPath).Path $map | Add-Member -NotePropertyName $key -NotePropertyValue $Repository -Force Save-GhRepoMap $map Write-Host 已绑定: $key - $Repository } function Get-GhProjectRepoMap { $map Get-GhRepoMap $map.PSObject.Properties | ForEach-Object { [PSCustomObject]{ ProjectPath $_.Name; Repository $_.Value } } } function Remove-GhProjectRepo { param([Parameter(Mandatory$true)][string]$ProjectPath) $map Get-GhRepoMap $key (Resolve-Path -LiteralPath $ProjectPath).Path $map.PSObject.Properties.Remove($key) Save-GhRepoMap $map } function Clear-GhProjectRepoMap { Save-GhRepoMap {} Write-Host 映射已清空 } function gh { $argsList ($args) if ($argsList.Count -ge 2 -and $argsList[0] -eq pr -and $argsList[1] -eq status) { $inGit $false try { git rev-parse --is-inside-work-tree 2$null | Out-Null if ($LASTEXITCODE -eq 0) { $inGit $true } } catch { $inGit $false } if (-not $inGit) { $map Get-GhRepoMap $cwd (Get-Location).Path $matched $null foreach ($p in $map.PSObject.Properties) { if ($cwd -like $($p.Name)*) { $matched $p.Value; break } } if ($matched) { Write-Host 非 Git 目录使用映射: $matched gh.exe pr status -R $matched ($argsList[2..($argsList.Count-1)]) return } else { Write-Error 当前目录不是 Git 仓库且没有目录映射。请先 Set-GhProjectRepo 绑定。 return } } } gh.exe argsList }然后在 PowerShell profile 里加载它。先确认 profile 路径$PROFILE如果目录不存在就创建再把加载语句写进去New-Item -ItemType Directory -Force -Path (Split-Path -Parent $PROFILE) Add-Content -LiteralPath $PROFILE -Value . C:\Tools\GitHubCliFallback.ps1映射文件本身长这样存放在%APPDATA%\GitHub CLI\codex-project-repos.json{ E:\\UnityProject\\yuanlin: your-org/your-repo, E:\\AI抠图: owner/another-repo }注意 JSON 里的反斜杠要转义成\\。这个文件由Set-GhProjectRepo自动维护一般不用手改但知道结构方便排障。绑定命令Set-GhProjectRepo -ProjectPath E:\UnityProject\yuanlin -Repository your-org/your-repo Get-GhProjectRepoMap到这里Base URL、Key、Model ID 三件套在 Codex 侧是auth.json里的OPENAI_BASE_URLOPENAI_API_KEY 模型名GitHub CLI 侧是映射文件里的项目路径 owner/repo。两套配置各管一摊互不干扰。4. 验证请求与 gh pr status 回归检查配置写完必须验证否则你只是「以为」它生效了。分三步走。第一步验证 PowerShell 函数加载成功。重开一个 PowerShell 窗口执行Get-Command gh Get-Command Set-GhProjectRepo Get-Command Get-GhProjectRepoMap如果gh的CommandType显示Function说明包装层生效如果显示Application说明 profile 没加载检查$PROFILE路径和脚本路径是否正确。第二步验证非 Git 目录下的行为。先在一个没映射的 Codex 临时目录里测试cd C:\Users\你的用户名\Documents\Codex\some-folder gh pr status预期结果是报错提示当前目录不是 Git 仓库且没有映射。这是正确行为——它不会偷偷帮你选一个仓库。然后绑定并重测Set-GhProjectRepo -ProjectPath C:\Users\你的用户名\Documents\Codex\some-folder -Repository your-org/your-repo gh pr status预期输出里会先打印非 Git 目录使用映射: your-org/your-repo然后列出该仓库的 PR 状态包括当前分支关联的 PR、你参与的 PR 等。第三步验证真实 Git 仓库目录不受影响。进入一个真正的 Git 仓库cd E:\UnityProject\yuanlin gh pr status这里git rev-parse会成功包装层直接把调用透传给gh.exe行为和原生完全一致。这一步是回归检查的关键确认你的包装层没有破坏原有逻辑。第四步验证 Codex 侧模型请求。在 Codex 里发一条简单请求观察是否正常返回。如果报401说明 Key 或 Base URL 有问题如果报local proxy failed通常是网络层或 Base URL 写错。可以先用 curl 直接打 TaoToken 的 API 确认连通性curl.exe https://taotoken.net/api/v1/models -H Authorization: Bearer sk-你的实际Key返回模型列表就说明 Key 和 Base URL 都对。这一步能把「Codex 配置问题」和「网络问题」分开定位。5. 常见报错排查401、local proxy failed、reading choices、OAuth这一节对照真实报错逐个拆。401 UnauthorizedCodex 侧最常见。原因通常是auth.json里的 Key 写错、Key 已失效、或者 Base URL 末尾多了斜杠导致拼接出//v1。检查方法确认OPENAI_BASE_URL是https://taotoken.net/api不带尾斜杠确认 Key 是从控制台复制完整、没有多余空格。改完用第 4 节的 curl 命令验证。local proxy failed这个报错通常出现在 Codex 尝试走本地代理但代理没起来或者 Base URL 指向了一个不可达的地址。先确认auth.json里的 Base URL 是 TaoToken 的地址而不是localhost。如果之前配过本地代理把相关环境变量清掉Remove-Item Env:HTTP_PROXY -ErrorAction SilentlyContinue Remove-Item Env:HTTPS_PROXY -ErrorAction SilentlyContinuereading choices 相关报错这类错误多半是auth.json或config.toml的 JSON/TOML 结构不合法Codex 解析配置时读不到预期的字段。用第 2 节的ConvertFrom-Json校验或者用 TOML 校验工具检查config.toml。特别注意auth.json里不能有注释和尾逗号。OAuth 相关报错如果你之前用gh auth login走过 OAuth 流程token 过期后会报认证失败。重新登录即可gh auth login gh auth status注意gh的 OAuth 和 Codex 的 API Key 是两套独立认证不要混。gh auth status管的是 GitHub CLI 访问 GitHub 的凭据auth.json管的是 Codex 访问模型的凭据。gh pr status 仍然报 not a git repository说明包装层没生效。按顺序检查Get-Command gh是否显示 Function$PROFILE里的加载语句路径是否正确脚本文件是否真的存在于C:\Tools\GitHubCliFallback.ps1映射文件里当前目录的 key 是否用了转义反斜杠。还有一个隐蔽问题Resolve-Path在目录不存在时会抛错绑定前确认ProjectPath真实存在。映射匹配不上包装层用的是$cwd -like $($p.Name)*前缀匹配。如果你的项目路径是E:\UnityProject\yuanlin而当前目录是E:\UnityProject\yuanlin\sub能匹配上但如果映射 key 末尾带了反斜杠或者大小写不一致可能匹配失败。统一用Set-GhProjectRepo绑定它会用Resolve-Path规范化路径。6. 长期维护与 CTA把配置固定下来这套方案能长期用的前提是「脚本放长期目录、映射集中管理」。把GitHubCliFallback.ps1放在C:\Tools\而不是 Codex 的临时工作目录这样你清理 Codex 会话目录、迁移项目时不会把功能一起删掉。映射文件在%APPDATA%\GitHub CLI\codex-project-repos.json换机器时把这个文件一起带走或者在新机器上用Set-GhProjectRepo重新绑一遍。如果哪天不想要这个功能两种撤销方式只清映射用Clear-GhProjectRepoMap保留包装逻辑彻底撤销就删掉 profile 里的加载语句和脚本文件再删映射文件系统回到 GitHub CLI 原生行为。Codex 侧的模型接入长期编码和 Agent 场景建议用 Coding Plan入口在https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcoding-plan日常验证模型是否正常用模型对话页https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentchat快速试一条Key 管理和接入文档分别是https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentapi-keys和https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdoc。Claude Code 用户如果也要接参考https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentclaude-code-anthropic。最后留一个实用习惯每次新开 Codex 项目目录第一件事就是Set-GhProjectRepo绑定然后gh pr status跑一次确认。绑定一次后面这个目录的所有 PR 查询都不用再手动传-R。
返回列表