为github私人仓库获取"终端提示禁用"错误的结果

tom*_*cam 152 git go

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

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

$ cd $GOPATH
$ go get github.com/examplesite/myprivaterepo
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.创建文件scheduler.go,添加到repo,然后推送.

$ vim scheduler.go
$ git add scheduler.go
$ git commit
$ git push
Run Code Online (Sandbox Code Playgroud)

Everythng没关系.但当我去一台干净的笔记本电脑并试图克隆回购时,我收到一个错误:

# 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
Run Code Online (Sandbox Code Playgroud)

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

Wyl*_*udd 236

我发现这非常有帮助,它解决了我的问题.像Mike Graf一样,我使用2FA,但与Mike Graf不同,我不使用Mac.此命令将允许您的2FA执行其操作(并省去输入用户名和密码的麻烦):

--add

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

如果你没有使用2FA,你仍然可以使用SSH,这将有效.

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

  • 我建议添加** - 添加**标志,这样你就不会覆盖你可能拥有的现有设置.例如:`git config --global --add url."git@github.com:".insteadof"https:/ /github.com/"` (11认同)
  • 这是IMO的最佳解决方案.使用SSH密钥进行身份验证而不是用户名/密码更安全,更省力(一旦设置) (4认同)
  • 因此,对于想知道如何撤消此操作的人,它将在 `C:\Users\<you>\.gitconfig` 中添加一个部分,您可以直接删除该部分 (4认同)
  • 不要在 Windows 上执行此操作。我最终遇到错误`git@github.com: Permission denied (publickey)。致命:无法从远程存储库读取。`。 (3认同)
  • Mac用户的完美解决方案! (2认同)
  • 这很好,直到您的公司阻止所有 ssh 出站传输。 (2认同)
  • 我正在使用 Windows,现在我被卡住了(应该早点发现@ShitalShah 的警告...)有什么办法可以撤消这个操作吗? (2认同)

小智 142

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

env GIT_TERMINAL_PROMPT=1 go get github.com/examplesite/myprivaterepo
Run Code Online (Sandbox Code Playgroud)

  • xxxx代表什么?我应该在哪里输入整行? (13认同)
  • 这成功了: go env -w GOPRIVATE=github.com/{your-github-user-here}/* (10认同)
  • 我已经尝试了这里所有的最佳答案(设置上面的环境变量,使用代替更新 git config,在 go get 之前运行 git clone),并且 go get 仍然因该问题而失败。我还能尝试什么吗? (5认同)
  • 你应该用xxxx替换go package,例如:`env GIT_TERMINAL_PROMPT = 1 go get github.com/examplesite/myprivaterepo` (3认同)
  • 谢谢@Ferrarezi,这正是我所需要的。https://www.goproxy.io/docs/GOPRIVATE-env.html 对此进行了解释。 (3认同)

Muh*_*man 75

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

git config --global --add url."git@github.com:".insteadOf "https://github.com/"
Run Code Online (Sandbox Code Playgroud)

或者,如果您已经在您的机器中使用sshwith 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/
Run Code Online (Sandbox Code Playgroud)
  • 如果要禁用密码提示,则需要缓存密码。有关如何在 mac、windows 或 linux 上缓存您的 github 密码的更多信息,请访问此页面

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

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

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

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

export GOPRIVATE=*.corp.example.com,github.com/mycompany/*
Run Code Online (Sandbox Code Playgroud)

或者

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

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

machine github.com login USERNAME password APIKEY
Run Code Online (Sandbox Code Playgroud)
  • 对于 GitHub 帐户,密码可以是个人访问令牌
  • 有关如何执行此操作的更多信息,请查看 Go FAQ页面。

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

  • `export GOPRIVATE=github.com/MyCompanyName/*` 对我有用。 (10认同)
  • `GOPRIVATE` (`go env -w GOPRIVATE=github.com/mycompany/*`) 是唯一对我有用的东西。我可能建议将其放在自己的标题下,甚至放在自己的答案中以更多地强调它。 (5认同)
  • 对我来说,只有 `go env -w GOPRIVATE=gitlab.companyname.com` 有帮助。这应该是一个可以接受的答案。感谢您的详尽回答。 (2认同)
  • GOPRIVATE 和 .netrc 文件对我有用 (2认同)
  • 这应该是彻底接受的答案。它在最后期限前救了我。 (2认同)

Mik*_*raf 37

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

2对我来说,我启用了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. 删除刚刚克隆的回购并重新测试以确保缓存信用 - git clone https://github.com/user/private_repo而这次并没有要求提供信用.

    1. go get将适用于个人访问令牌可以访问的任何存储库.随着权限的变化,您可能需要重复其他帐户/令牌的步骤.

  • 这也非常好,因为您可以将令牌的范围限制为仅仅"读取"私有存储库,因此即使它以某种方式进入野外图像,它们也只能读取您的代码并且不会将其推入其中,您可以很容易撤销令牌.我不记得他们是否内置了自动过期功能. (3认同)
  • 我有 2FA,这对我有用——生成了一个令牌(具有完整的权限),对我自己现有的一个存储库(它实际上是公开的)做了一个 `git clone`,被提示输入我的 `username`,放入我的GitHub 用户名,然后输入生成的“密码”令牌——删除克隆的存储库,然后重新运行“go get”命令,一切正常——谢谢!(这里也有 OSX) (2认同)

Vik*_*wal 30

添加这是您的 bash_profile:

export GOPRIVATE=github.com/your-organization/*
Run Code Online (Sandbox Code Playgroud)

然后运行:

git config --global --add url."git@github.com:".insteadOf "https://github.com/"
Run Code Online (Sandbox Code Playgroud)


EdH*_*EdH 13

如果你只是想go get快速工作,并继续你的工作......

只是出口 GIT_TERMINAL_PROMPT=1

$ export GIT_TERMINAL_PROMPT=1
$ go get [whatever]
Run Code Online (Sandbox Code Playgroud)

它现在将提示您为shell会话的其余部分提供用户/传递.将其放入您.profilegit上面的设置中,以获得更持久的解决方案.

  • 好吧,简单又棒 (2认同)

小智 9

我尝试添加这个命令

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

这对我有用


Sur*_*rya 7

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

export GOPRIVATE=github.com/{organizationName/userName of the package}/*  
Run Code Online (Sandbox Code Playgroud)

  • 这可能是OP **应该**提出的问题的正确答案。 (7认同)
  • 这是唯一对我有用的解决方案。:) (2认同)
  • 这是 go 1.13 或更高版本的正确答案 (2认同)

Ann*_*wal 6

虽然关于使用 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
Run Code Online (Sandbox Code Playgroud)

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

go env -w GOPRIVATE=github.com/{your-username}/*
Run Code Online (Sandbox Code Playgroud)

编辑:正确的措辞。


小智 5

如果使用此选项配置 gitconfig,稍后克隆 GitHub 的其他存储库时会出现问题

git config --global --add url. "Git@github.com". Instead, "https://github.com/"
Run Code Online (Sandbox Code Playgroud)

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

echo "export GIT_TERMINAL_PROMPT=1" >> ~/.bashrc || ~/.zshrc
Run Code Online (Sandbox Code Playgroud)

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