在'终端提示禁用'错误的github私人回购

我从浏览器中使用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

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

406076 次浏览

第一个——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克隆了一个私有repo,只是为了让它缓存密码git clone https://github.com/user/private_repo,并使用你的github.com用户名作为用户名,生成的个人访问令牌作为密码。
  4. 删除刚刚克隆的回购和重新测试,以确保信用被缓存——git clone https://github.com/user/private_repo,这次没有要求信用。

    1. Go get将适用于个人访问令牌可以访问的任何回购。由于权限不同,您可能必须对其他帐户/令牌重复上述步骤。
    2. 李< / ol > < / >

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

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

我发现这非常有用,它解决了我的问题。这个命令将允许你的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/

如果你只是想让go get工作得非常快,并与你的工作一起移动…

只需导出GIT_TERMINAL_PROMPT=1即可

$ export GIT_TERMINAL_PROMPT=1
$ go get [whatever]

现在它将提示您为shell会话的其余部分输入一个用户/通道。把它放在你的.profile或设置git作为一个更永久的解决方案。

我在windows上有同样的问题“错误:未能执行提示脚本(退出代码1)” “https://github.com”的用户名:没有错误“试图通过登录对话框登录到github。当我取消对话框时,git在命令行中问我登录名和密码,它工作得很好

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

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

相反,我建议您使用这个选项

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

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

它会抱怨,因为它需要使用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命令认为哪些模块是私有的(不是公开的),因此应该使用代理或校验和数据库。

变量是一个以逗号分隔的模块路径前缀模式列表(与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

我希望这能帮助社区,并节省其他人的时间来快速解决所描述的问题。如果你想要更多的支持或帮助,请随时留下评论。

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

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

在更改我的凭据后,我遇到了这个错误terminal prompts disabled,迦太基未能更新依赖项并在终端上显示此错误。

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

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

这是你的bash_profile:

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

然后运行:

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

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

重申一下,默认情况下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}/*

编辑:措辞正确。

我试着添加这个命令

出口GOPRIVATE = github.com/ {private_reponame} / *

这对我很有效

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

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

https://<user>:<access-token>@<gitlab-server>/<path-to-repo>.git