在github私有存储库中获得“终端提示已禁用”错误的结果


187

我从浏览器使用Github UI创建了私有仓库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

一切都很好。但是,当我去一台干净的笔记本电脑尝试克隆存储库时,出现了一个错误:

# 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

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


10
这不是go错误,git返回“禁用终端提示”。可以git clone https://github.com/examplesite/myprivaterepo在笔记本电脑上运行吗?
JimB

1
谢谢。git克隆起作用了。然后,开始工作。这是怎么回事?我是否每次都要像这样“启动泵”,还是我配置不正确?
tomcam 2015年

1
@tomcam,您可以将ssh密钥添加到github帐户,并且get从一开始就可以使用,请参阅help.github.com/articles/generating-ssh-keys
alex vasi 2015年

@alexvasi:仅当他首先通过ssh克隆存储库时,此方法才有效,因为https://github.com/如果导入路径不存在,它将向要求。git的过程应该能够提示输入用户名/密码,所以必须有笔记本配置不同的东西-不同的外壳,不同的.gitconfig,一个环境变量,等等
JimB

所有这些都帮助了我,但是我不确定如何标记为已回答和/或已解决。到目前为止,这就是我所拥有的。
tomcam 2015年

Answers:


173

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

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

306

我发现这非常有帮助,它解决了我的问题。此命令将使您的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,这将起作用。

编辑:--add根据slatunje的建议添加了标志。


12
我建议添加--add标志,以免覆盖现有的设置,例如:git config --global --add url."git@github.com:".insteadOf "https://github.com/"
slatunje

谢谢slatunje,根据您的反馈将标记添加到我的回答中。
Wylliam Judd

5
这是IMO的最佳解决方案。使用SSH密钥而不是用户名/密码进行身份验证使用SSH密钥更安全,更省力(一次安装)
bodecker

1
不要在Windows上执行此操作。我以错误告终git@github.com: Permission denied (publickey). fatal: Could not read from remote repository.
Shital Shah,

1
也适用于linux。如果您使用的是ssh
globaly,

38

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

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

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

    1. go get将与个人访问令牌可以访问的任何存储库一起使用。由于权限的不同,您可能必须对其他帐户/令牌重复上述步骤。

1
我有2FA,这对我有用-生成了一个令牌(具有完全privs),做了git clone我自己的一个现有存储库之一(实际上是公共的),被提示输入我username,输入我的GitHub用户名,然后输入生成的令牌password-删除了克隆的仓库,然后重新运行go get命令,一切正常-谢谢!(以及此处的OSX)
Eric Dorsey

3
这也确实很棒,因为您可以将令牌的范围限制为只能对私有存储库“读取”,因此即使它以某种方式进入野外图像,他们也只能读取您的代码,而不能将其压入其中,您可以真的很容易撤销令牌。我不记得他们是否内置了自动过期功能。
Dragon788

16

如果您只是想go get快速地工作,并随您的工作一起前进...

刚出口 GIT_TERMINAL_PROMPT=1

$ export GIT_TERMINAL_PROMPT=1
$ go get [whatever]

现在它将提示您输入其余shell会话的用户/密码。将其放在您的.profilegit如上所述的设置中,以获得更永久的解决方案。


14

它抱怨,因为它需要使用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密码的更多信息,请访问此页面

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

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

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

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

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

要么

go env -w GOPRIVATE=github.com/mycompany/*
  • 有关如何解决私有软件包/模块校验和验证问题的更多信息,请阅读本文
  • 有关Go 13模块和新增强功能的更多信息,请查看Go 1.13模块发行说明

最后一件值得一提的事情是,您仍然可以配置go get身份验证和获取https,您所需要做的就是将以下行添加到$HOME/.netrc

machine github.com login USERNAME password APIKEY

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


GOPRIVATEgo env -w GOPRIVATE=github.com/mycompany/*)是唯一对我有用的东西。我可能建议将其置于自己的标题下,或者甚至在其自身的答案中加以强调。
Bernhard Barker

1

如果您使用此选项配置gitconfig,则稍后在克隆GitHub的其他存储库时会遇到问题

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

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

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

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


0

我在Windows上遇到了同样的问题,“错误:无法执行提示脚本(退出代码1),致命:无法读取' https://github.com '的用户名:没有错误”,试图通过登录对话框登录github。当我取消对话框时,git要求我在命令行中输入登录名和密码,它运行良好。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.