【问题标题】:go get results in 'terminal prompts disabled' error for github private repogo get results in 'terminal prompts disabled' error for github private repo
【发布时间】:2015-11-20 20:22:28
【问题描述】:

我在浏览器中使用 Github UI 创建了私有 repo examplesite/myprivaterepo。

然后我去了我的 go 目录(在桌面上)并克隆了它:

$ cd $GOPATH
$ go get github.com/examplesite/myprivaterepo

到目前为止一切顺利。创建文件 scheduler.go,添加到 repo 并推送。

$ vim scheduler.go
$ git add scheduler.go
$ git commit
$ git push

一切正常。但是当我去一台干净的笔记本电脑并尝试克隆 repo 时,我收到了一个错误:

# Now on laptop, which doesn't yet know about the repo
$ cd $GOPATH
$ go get github.com/examplesite/myprivaterepo
# At this point it should ask for my user ID and password ,right? But it doesn't.
# Instead, this error occurs:
cd .; git clone https://github.com/examplesite/myprivaterepo /Users/tom/go/src/github.com/examplesite/myprivaterepo
Cloning into '/Users/tom/go/src/github.com/examplesite/myprivaterepo'...
fatal: could not read Username for 'https://github.com': terminal prompts disabled
package github.com/examplesite/myprivaterepo: exit status 128

为什么我的笔记本电脑讨厌我自己的仓库,我怎样才能让它接受它的命运?谢谢。

【问题讨论】:

  • 这不是go 错误,git 正在返回“终端提示已禁用”。您可以在笔记本电脑上运行git clone https://github.com/examplesite/myprivaterepo 吗?
  • 谢谢。 git 克隆工作。然后开始工作。这是怎么回事?我是否必须每次都像这样“启动泵”,还是我配置错误?
  • @tomcam,您可以将 ssh 密钥添加到 github 帐户,然后 go get 将从头开始工作,请参阅 help.github.com/articles/generating-ssh-keys
  • @alexvasi:只有当他首先通过 ssh 自己克隆 repo 时才有效,因为如果导入路径不存在,它将从 https://github.com/ 请求。 git 进程应该能够提示输入用户名/密码,因此笔记本电脑配置中肯定有一些不同的东西——不同的 shell、不同的 .gitconfig、环境变量等。
  • 所有这些都对我有所帮助,但我不确定如何标记为已回答和/或已解决。这是我到目前为止所拥有的。

标签: git go


【解决方案1】:

我发现这非常有用,它解决了我的问题。此命令将允许您的 2FA 执行其操作(并省去输入用户名和密码的麻烦):

git config --global --add url."git@github.com:".insteadOf "https://github.com/"

来源:http://albertech.blogspot.com/2016/11/fix-git-error-could-not-read-username.html

如果您不使用 2FA,您仍然可以使用 SSH,这将起作用。

编辑:按照slatunje 的建议添加了--add 标志。

【讨论】:

  • 我建议添加 --add 标志,这样您就不会覆盖您可能拥有的现有设置 例如:git config --global --add url."git@github.com:".insteadOf "https://github.com/"
  • 这是 IMO 的最佳解决方案。使用 SSH 密钥而不是用户名/密码进行身份验证更安全、更省力(一旦设置)
  • 不要在 Windows 上执行此操作。我最终遇到了错误git@github.com: Permission denied (publickey). fatal: Could not read from remote repository.
  • 我正在使用 Windows,但现在我被卡住了(应该早点发现 @ShitalShah 的警告......)有什么办法可以撤消这个吗?
  • 所以对于想知道如何撤消此操作的人,它将在C:\Users\<you>\.gitconfig 中添加一个您可以直接删除的部分
【解决方案2】:

go get 默认禁用“终端提示”。这可以通过设置git的环境变量来改变:

env GIT_TERMINAL_PROMPT=1 go get github.com/examplesite/myprivaterepo

【讨论】:

  • 我在这里尝试了所有最重要的答案(在上面设置环境变量,使用 insteadOf 更新 git config,在 go get 之前运行 git clone)并且 go get 仍然因该问题而失败。还有什么我可以尝试的吗?
  • 这成功了:go env -w GOPRIVATE=github.com/{your-github-user-here}/*
  • 如果它对任何人有帮助,我从另一个仓库复制了 go.modgo.sum 文件并尝试使用它们。每当我尝试转到go build 时,这都会给我 git 登录提示,因为 git 一直在尝试向其他人的 github 存储库进行身份验证。要解决此问题,您可以运行 go mod init,然后您应该不再看到这些登录提示。
  • 感谢@Ferrarezi,这正是我所需要的。 goproxy.io/docs/GOPRIVATE-env.html 解释它。
【解决方案3】:

它抱怨是因为它需要使用 ssh 而不是 https 但你的 git 仍然配置了 https。所以基本上就像前面提到的其他人一样,您需要启用提示或将 git 配置为使用ssh 而不是https。运行以下命令的简单方法:

git config --global --add url."git@github.com:".insteadOf "https://github.com/"

或者如果你已经在你的机器中使用sshgit,你可以安全地编辑~/.gitconfig并在最底部添加以下行

注意:这涵盖了所有 SVC、源代码版本控制,这取决于你具体使用什么,github、gitlab、bitbucket)

# Enforce SSH
[url "ssh://git@github.com/"]
  insteadOf = https://github.com/
[url "ssh://git@gitlab.com/"]
        insteadOf = https://gitlab.com/
[url "ssh://git@bitbucket.org/"]
  insteadOf = https://bitbucket.org/
  • 如果要禁用密码提示,则需要缓存密码。有关如何在 mac、windows 或 linux 上缓存 github 密码的更多信息,请访问this page

  • 有关如何将 ssh 添加到您的 github 帐户的更多信息,请访问this page

此外,更重要的是,如果这是公司或您自己的私有存储库,您可能需要跳过对此类存储库使用代理或校验和数据库以避免公开暴露它们。

为此,您需要设置GOPRIVATE 环境变量来控制 go 命令认为哪些模块是私有的(不公开),因此应该使用代理或校验和数据库。

该变量是以逗号分隔的模式列表(与 Go 的 path.Match 的语法相同)的模块路径前缀。例如,

export GOPRIVATE=*.corp.example.com,github.com/mycompany/*

或者

go env -w GOPRIVATE=github.com/mycompany/*

最后一件事不要忘记提及,您仍然可以配置go get 来通过https 进行身份验证和获取,您所需要做的就是将以下行添加到$HOME/.netrc

machine github.com login USERNAME password APIKEY
  • 对于 GitHub 帐户,密码可以是 personal access tokens
  • 有关如何执行此操作的更多信息,请查看 Go FAQ 页面。

我希望这有助于社区并节省其他人的时间来快速解决所描述的问题。如果您需要更多支持或帮助,请随时发表评论。

【讨论】:

  • GOPRIVATE (go env -w GOPRIVATE=github.com/mycompany/*) 是唯一对我有用的东西。我可能会建议将其放在自己的标题下,甚至放在自己的答案中以更加突出它。
  • 对我来说也是如此,只有go env -w GOPRIVATE=gitlab.companyname.com 有帮助。这应该是一个公认的答案。感谢您的详尽回答。
【解决方案4】:

1st -- go get 将拒绝在命令行上进行身份验证。因此,您需要在 git 中缓存凭据。因为我使用 osx,所以我可以使用 osxkeychain 凭证助手。

第二对我来说,我启用了 2FA,因此无法使用我的密码进行身份验证。相反,我必须生成一个个人访问令牌来代替密码。

  1. 设置osxkeychain凭证助手https://help.github.com/articles/caching-your-github-password-in-git/
  2. 如果使用 TFA 而不是使用您的密码,请生成一个具有 repo 范围 https://github.com/settings/tokens 的个人访问令牌
  3. git 克隆一个私有仓库只是为了让它缓存密码git clone https://github.com/user/private_repo 并使用你的 github.com 用户名作为用户名,并使用生成的个人访问令牌作为密码。
  4. 删除了刚刚克隆的 repo 并重新测试以确保 creds 被缓存 -- git clone https://github.com/user/private_repo 并且这次没有要求 creds。

    1. go get 将适用于个人访问令牌可以访问的任何存储库。由于权限不同,您可能需要对其他帐户/令牌重复这些步骤。

【讨论】:

  • 我有 2FA,这对我有用 - 生成了一个令牌(具有完整的 privs),对我自己现有的一个存储库(实际上是公开的)做了一个 git clone,被提示输入我的username,输入我的 GitHub 用户名,然后输入为 password 生成的令牌 - 删除克隆的 repo,然后重新运行 go get 命令,一切都很好 - 谢谢! (这里也是 OSX)
  • 这也很棒,因为您可以将令牌的范围限制为仅“读取”私有存储库,因此即使它以某种方式进入野外图像,它们也只能读取您的代码和不要把东西塞进去,你可以很容易地撤销令牌。我不记得他们是否还内置了自动过期功能。
【解决方案5】:

如果您只想让go get 快速工作,并与您的工作保持同步......

只需导出GIT_TERMINAL_PROMPT=1

$ export GIT_TERMINAL_PROMPT=1
$ go get [whatever]

它现在会提示您在 shell 会话的其余部分输入用户/密码。将其放入您的.profile 或如上所述设置git 以获得更持久的解决方案。

【讨论】:

    【解决方案6】:

    从 go 1.13 开始,如果您已经使用 git 凭据配置了终端,但仍面临此问题,那么您可以尝试设置 GOPRIVATE 环境变量。设置这个环境变量为我解决了这个问题。

    export GOPRIVATE=github.com/{organizationName/userName of the package}/*  
    

    【讨论】:

    • 这可能是OP应该提出的问题的正确答案。
    【解决方案7】:

    添加这是你的 bash_profile:

    export GOPRIVATE=github.com/your-organization/*
    

    然后运行:

    git config --global --add url. "Git@github.com". Instead, "https://github.com/"
    

    【讨论】:

      【解决方案8】:

      我在 windows 上遇到了同样的问题“错误:执行提示脚本失败(退出代码 1) 致命:无法读取“https://github.com”的用户名:没有错误”尝试通过登录对话框登录到 github。当我取消对话框时,git 在命令行中询问我的登录名和密码,它工作正常。

      【讨论】:

        【解决方案9】:

        如果你用这个选项配置你的 gitconfig,你以后在克隆 GitHub 的其他 repos 时会遇到问题

        git config --global --add url. "Git@github.com". Instead, "https://github.com/"
        

        相反,我建议您使用此选项

        echo "export GIT_TERMINAL_PROMPT=1" >> ~/.bashrc || ~/.zshrc
        

        并且不要忘记从您的私有存储库生成访问令牌。当提示输入密码时,只需粘贴访问令牌。克隆快乐:)

        【讨论】:

          【解决方案10】:

          我在更改凭据后遇到此错误terminal prompts disabled,Carthage 无法更新依赖项并在终端上显示此错误。

          我只是做了以下简单的步骤,它就开始工作了……

          1. keychain access 中删除旧凭据
          2. 试图在不同位置克隆相同的 repo。
          3. 它要求设置凭据(用户名 + 密码)。
          4. 然后 Carthage 更新像以前一样工作。

          【讨论】:

            【解决方案11】:

            虽然有很多关于 GitHub 使用 SSH 身份验证的答案,但问题与 go 模块的正确用法有关。为此,Luna Lovegood 提供了正确答案here

            重申一下,Go 将默认尝试使用公共存储库来下载包。我们需要指定它使用 SSH 对私有存储库进行身份验证。为此,可以使用以下方法:

            go env -w GOPRIVATE=github.com/{your-username}/{your-lib}
            .
            .
            go mod vendor     # this will now work for your private lib
            

            正则表达式也可以,所以如果你有多个私有仓库,你可以添加

            go env -w GOPRIVATE=github.com/{your-username}/*
            

            【讨论】:

              猜你喜欢
              • 2017-07-13
              • 1970-01-01
              • 1970-01-01
              • 2021-05-01
              • 2021-06-09
              • 2022-06-12
              • 1970-01-01
              • 2022-12-02
              • 1970-01-01
              相关资源
              最近更新 更多