我从浏览器中使用Github UI创建了私人回购示例站点/myprivaterepo。

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

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

到目前为止一切顺利。创建文件调度程序。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

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


当前回答

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

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

其他回答

虽然关于在GitHub中使用SSH身份验证有很多答案,但这个问题与go模块的正确用法有关。为此,卢娜·洛夫古德给出了正确的答案。

重申一下,默认情况下Go会尝试使用公共存储库来下载包。我们需要指定它使用SSH进行私有回购的身份验证。要做到这一点,可以使用以下方法:

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

Glob模式也可以工作,因此如果您有多个私有存储库,您可以添加

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

编辑:措辞正确。

另一种选择是将凭证作为URL的一部分添加。

例如,要访问GitLab上的存储库,我使用这样的URL格式:

https:// <用户名>:<访问令牌> @ < gitlab-server > / < path-to-repo > .

我发现这非常有用,它解决了我的问题。这个命令将允许你的2FA做它的事情(并省去你输入用户名和密码的麻烦):

Github:

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

对于 Gitlab:

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

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

如果你不使用2FA,你仍然可以使用SSH,这是可以工作的。

生成的.gitconfig将像这样:

[url "git@github.com:"]
    insteadOf = https://github.com/

它会抱怨,因为它需要使用ssh而不是https,但你的git仍然配置了https。所以基本上就像前面提到的,你需要启用提示或者配置git使用SSH而不是https。一个简单的方法来做到这一点通过运行以下:

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

或者如果你已经在你的机器上使用了SSH和git,你可以安全地编辑~/。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命令认为哪些模块是私有的(不是公开可用的),因此不应该使用代理或校验和数据库。

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

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

Or

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

有关如何解决私有包/模块校验和验证问题的更多信息,请阅读本文。 有关go 13模块和新增强的更多信息,请查看go 1.13模块发布说明。

最后一件不要忘记的事情是,你仍然可以配置go get认证和通过https获取,你所需要做的就是在$HOME/.netrc中添加以下一行

machine github.com login USERNAME password APIKEY

对于GitHub帐户,密码可以是个人访问令牌。 有关如何做到这一点的更多信息,请查看Go FAQ页面。

如果你想要更多的支持或帮助,请随时留下评论。

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

对我来说,我已经启用了2FA,因此不能使用我的密码进行认证。相反,我必须生成一个个人访问令牌来代替密码。

setup osxkeychain credential helper https://help.github.com/articles/caching-your-github-password-in-git/ If using TFA instead of using your password, generate a personal access token with repo scope https://github.com/settings/tokens git clone a private repo just to make it cache the password git clone https://github.com/user/private_repo and used your github.com username for username and the generated personal access token for password. Removed the just cloned repo and retest to ensure creds were cached -- git clone https://github.com/user/private_repo and this time wasnt asked for creds. go get will work with any repos that the personal access token can access. You may have to repeat the steps with other accounts / tokens as permissions vary.