You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Heroku程序化部署认证失败求助:如何用go-git实现代码推送?

解决Heroku程序化部署的go-git认证失败问题

我来帮你拆解下使用go-git向Heroku推送代码时遇到的认证问题,以及对应的解决方案:

可能的问题点及排查方向

1. 推送目标参数不明确

你创建了名为heroku的远程仓库,但在PushOptions里没有指定推送的远程名称和分支。go-git默认不会自动识别刚创建的远程仓库,可能导致推送目标错误,进而触发认证失败。

2. Heroku认证的用户名可简化

Heroku的HTTP Git认证允许任意用户名(甚至空字符串),只需要正确的API密钥作为密码。虽然用邮箱作为用户名没问题,但空用户名能避免潜在的编码问题,反而更稳妥。

3. 仓库URL或API密钥存在笔误

注意到你调试日志里的仓库是infinite-garden-93715.git,但代码里写的是afternoon-ocean-91922.git,请先确认要推送的仓库URL和API密钥完全匹配,没有拼写错误。

4. go-git推送配置缺失必要参数

go-git的PushOptions需要明确指定RefSpecs来定义本地分支和远程分支的映射关系,否则可能无法正确触发推送流程。

修正后的代码示例

结合以上几点,调整你的代码如下:

r, err := git.PlainOpen("go-getting-started")
if err != nil {
    log.Fatal(err)
}

// 先检查远程仓库是否已存在,避免重复创建
remote, err := r.Remote("heroku")
if err != nil {
    remote, err = r.CreateRemote(&config.RemoteConfig{
        Name: "heroku",
        URLs: []string{"https://git.heroku.com/afternoon-ocean-91922.git"},
    })
    if err != nil {
        log.Fatal(err)
    }
}

// 明确指定推送分支和认证信息
err = remote.Push(&git.PushOptions{
    Auth: &http.BasicAuth{
        Username: "", // Heroku允许空用户名,仅校验API密钥
        Password: "6450sdf8-bd51-40da-9706-e39s85mc251f", // 你的Heroku API密钥
    },
    RefSpecs: []config.RefSpec{"refs/heads/master:refs/heads/master"}, // 推送本地master到远程master
    // 若你的主分支是main,替换为refs/heads/main:refs/heads/main
})
if err != nil {
    log.Fatal(err)
}

额外验证步骤

如果调整后仍失败,先通过curl手动验证API密钥的有效性:

curl -u :6450sdf8-bd51-40da-9706-e39s85mc251f https://git.heroku.com/afternoon-ocean-91922.git/info/refs?service=git-receive-pack

如果返回包含Git相关的内容,说明密钥有效;若返回401,需要重新获取正确的API密钥(可通过heroku auth:token命令生成)。

另外,请确保本地仓库已经完成所有代码提交,go-git不会推送未提交的内容。

内容的提问来源于stack exchange,提问作者No Name

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 12:24:11