将私有Gem部署到Heroku时遇GitHub权限问题求助
解决Heroku部署私有GitHub Gem的权限问题
我之前也碰到过一模一样的问题,本质就是Heroku在拉取私有GitHub仓库时没有有效的身份凭证,HTTPS模式下它没法自动提供用户名密码,所以才会报那个“could not read Username”的错误。给你几个靠谱的解决方法,选一个适合你的就行:
方法一:用GitHub Personal Access Token(PAT)直接修改Gem源URL(简单直接)
这是最快速的解决方式,不过要注意别把敏感信息提交到代码里:
- 先去GitHub生成一个Personal Access Token:
- 登录GitHub,进入Settings → Developer settings → Personal access tokens → Generate new token
- 只勾选
repo权限(足够访问私有仓库了,权限最小化更安全),然后生成并复制这个token(一定要记下来,刷新页面就看不到了)
- 修改你的Gemfile里的私有Gem引用,把原来的:
改成:gem 'pages-rails', git: 'https://github.com/revoxltd/pages-rails.git'
把gem 'pages-rails', git: 'https://<你的PAT>@github.com/revoxltd/pages-rails.git'<你的PAT>替换成刚才复制的token - 本地运行
bundle install更新Gemfile.lock,然后把修改后的Gemfile和Gemfile.lock提交到你的代码仓库 - 重新部署到Heroku,这时候Heroku就能用这个token拉取私有Gem了
⚠️ 注意:如果不想把PAT硬编码在Gemfile里,别用这个方法,看下面的方法二。
方法二:用Heroku环境变量+Bundler配置(更安全,推荐)
这个方法不用把PAT写进代码,通过环境变量传递凭证,更安全:
- 同样先生成一个带
repo权限的GitHub PAT - 登录Heroku控制台,找到你的应用,进入Settings → Config Vars,添加一个新的环境变量:
- 键:
BUNDLE_GITHUB__COM - 值:
你的PAT:x-oauth-basic(这里x-oauth-basic是固定值,GitHub用它来识别OAuth token)
- 键:
- 确保你的Gemfile里的引用还是原来的HTTPS地址:
gem 'pages-rails', git: 'https://github.com/revoxltd/pages-rails.git' - 重新部署Heroku,Bundler会自动读取这个环境变量里的凭证,顺利拉取私有仓库
方法三:用SSH方式(适合习惯SSH的用户)
如果平时用SSH访问GitHub,也可以用这种方式:
- 修改Gemfile里的URL为SSH格式:
gem 'pages-rails', git: 'git@github.com:revoxltd/pages-rails.git' - 生成一个新的SSH密钥对(别用你本地的个人密钥,专门用于部署更安全):
ssh-keygen -t ed25519 -C "heroku-deploy@your-app.com" - 把生成的公钥(
.pub文件内容)添加到GitHub目标仓库的Settings → Deploy keys里,勾选“Allow write access”(如果不需要写权限可以不勾) - 把私钥内容添加到Heroku的环境变量里,比如设置
HEROKU_SSH_PRIVATE_KEY,然后在部署时把私钥写到.ssh目录:- 可以用一个buildpack(比如
heroku-buildpack-ssh-key),或者在bin/postinstall脚本里处理私钥的写入 - 也可以直接用Heroku的配置命令设置GIT_SSH_COMMAND:
heroku config:set GIT_SSH_COMMAND="ssh -i /app/.ssh/id_rsa -o StrictHostKeyChecking=no"
- 可以用一个buildpack(比如
不过这种方法步骤多一点,如果你只是解决Gem拉取的问题,方法二更推荐。
内容的提问来源于stack exchange,提问作者user3349825
相关产品推荐
相关产品推荐

