471

I created the private repo examplesite/myprivaterepo using the GitHub UI from my browser.

Then I went to my go directory (on the desktop) and cloned it:

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

So far so good. Created the file scheduler.go, added to repo and pushed.

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

Everythng's OK. But when I went to a clean laptop and tried to clone the repo, I got an error:

# 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 

Why is my laptop hating on my own repo and how can I get it to accept its fate?

Thanks.

7
  • 12
    This isn't a go error, git is returning "terminal prompts disabled". Can you run git clone https://github.com/examplesite/myprivaterepo on your laptop? Commented Aug 26, 2015 at 17:20
  • 4
    Thank you. The git clone worked. Then the go get worked. What's the deal? Do I have to "prime the pump" like this every time or did I misconfigure something? Commented Aug 26, 2015 at 22:08
  • 3
    @tomcam, you can add ssh keys to github account and go get will work from the start, see help.github.com/articles/generating-ssh-keys Commented Aug 27, 2015 at 14:13
  • 1
    @alexvasi: that only works if he clones the repo himself over ssh first, since it will request from https://github.com/ if the import path doesn't exist. The git process should be able to prompt for the username/password, so there must be something different in the laptop configuration -- different shell, different .gitconfig, an env variable, etc. Commented Aug 27, 2015 at 17:55
  • 1
    All of this has helped me, but I'm not sure how to mark as answered and/or resolved. Here's what I have so far. Commented Aug 27, 2015 at 20:24

18 Answers 18

810
+50

I found this extremely helpful, and it solved my problem. This command will allow your 2FA to do its thing (and save you the trouble of entering your username and password):

For Github:

git config --global --add url."[email protected]:".insteadOf "https://github.com/" 

For Gitlab:

git config --global --add url."[email protected]:".insteadOf "https://gitlab.com/" 

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

If you're not using 2FA, you can still use SSH and this will work.

Resulting .gitconfig will be like:

[url "[email protected]:"] insteadOf = https://github.com/ 
Sign up to request clarification or add additional context in comments.

18 Comments

I recommend adding --add flag so that you do not overwrite existing settings you may have For example: git config --global --add url."[email protected]:".insteadOf "https://github.com/"
This is the best solution IMO. It's more secure and less effort (once setup) to use SSH keys for auth instead of username/password
Don't do this on Windows. I ended up with error [email protected]: Permission denied (publickey). fatal: Could not read from remote repository..
I'm using windows and now I'm stuck(should spot the warning by @ShitalShah earlier...) any way to undo this?
So for whoever wondering how to undo this, it will add a section in C:\Users\<you>\.gitconfig which you can remove directly
|
266

go get disables the "terminal prompt" by default. This can be changed by setting an environment variable of git:

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

5 Comments

I've tried all of the top answers here (set environment variable above, update git config using insteadOf, running git clone before go get) and go get is still failing with that issue. Anything else i can try?
This did the trick: go env -w GOPRIVATE=github.com/{your-github-user-here}/*
If it helps anyone I copied the go.mod and go.sum files from another repo and tried to use those. This gave me git login prompts whenever I tried to go go build because git kept trying to authenticate to someone else's github repo. To fix this you can run go mod init and then you should stop seeing these login prompts.
Thanks @Ferrarezi, that was exactly what I needed. goproxy.io/docs/GOPRIVATE-env.html explains it.
I also found the suggestion by @Ferrarezi useful to help solve my similar problem. Thanks Ferrarezi.
215

It complains because it needs to use ssh instead of https but your git is still configured with https. so basically as others mentioned previously you need to either enable prompts or to configure git to use ssh instead of https. a simple way to do this by running the following:

git config --global --add url."[email protected]:".insteadOf "https://github.com/" 

or if you already use ssh with git in your machine, you can safely edit ~/.gitconfig and add the following line at the very bottom

Note: This covers all SVC, source version control, that depends on what you exactly use, github, gitlab, bitbucket)

# Enforce SSH [url "ssh://[email protected]/"] insteadOf = https://github.com/ [url "ssh://[email protected]/"] insteadOf = https://gitlab.com/ [url "ssh://[email protected]/"] insteadOf = https://bitbucket.org/ 
  • If you want to keep password pompts disabled, you need to cache password. For more information on how to cache your github password on mac, windows or linux, please visit this page.

  • For more information on how to add ssh to your github account, please visit this page.

Also, more importantly, if this is a private repository for a company or for your self, you may need to skip using proxy or checksum database for such repos to avoid exposing them publicly.

To do this, you need to set GOPRIVATE environment variable that controls which modules the go command considers to be private (not available publicly) and should therefore NOT use the proxy or checksum database.

The variable is a comma-separated list of patterns (same syntax of Go's path.Match) of module path prefixes. For example,

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

Or

go env -w GOPRIVATE=github.com/mycompany/* 
  • For more information on how to solve private packages/modules checksum validation issues, please read this article.
  • For more information about go 13 modules and new enhancements, please check out Go 1.13 Modules Release notes.

One last thing not to forget to mention, you can still configure go get to authenticate and fetch over https, all you need to do is to add the following line to $HOME/.netrc

machine github.com login USERNAME password APIKEY 
  • For GitHub accounts, the password can be a personal access tokens.
  • For more information on how to do this, please check Go FAQ page.

Please feel free to leave a comment in case you want more support or help.

7 Comments

GOPRIVATE (go env -w GOPRIVATE=github.com/mycompany/*) is the only thing that worked for me. I might suggest putting that under its own heading or even in an answer of its own to highlight it a bit more.
For me as well , only go env -w GOPRIVATE=gitlab.companyname.com helped. This should be an accepted answer. Thank you for this thorough answer.
This should be the accepted answer being thorough. It's saved me on a deadline.
export GOPRIVATE=github.com/MyCompanyName/* is what worked for me.
export GOPRIVATE=github.com/MyCompanyName/* the only solution here as well, up
|
51

1st -- go get will refuse to authenticate on the command line. So you need to cache the credentials in git. Because I use osx I can use osxkeychain credential helper.

2nd For me, I have 2FA enabled and thus could not use my password to auth. Instead I had to generate a personal access token to use in place of the password.

  1. setup osxkeychain credential helper https://help.github.com/articles/caching-your-github-password-in-git/
  2. If using TFA instead of using your password, generate a personal access token with repo scope https://github.com/settings/tokens
  3. 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.
  4. 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.

    1. 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.

3 Comments

I have 2FA and this worked for me -- generated a token (with full privs), did a git clone of one of my own existing repos (it is public actually), was prompted for my username, put in my GitHub username, then put in the generated token for password -- deleted the cloned repo, then reran the go get command and all was well - thanks! (OSX here as well)
This is also really great because you can limit the scope of the token to only "read" for private repos so even if it somehow gets into an image in the wild, they can only read your code and not push things into it and you can revoke the token really easily. I can't recall if they have auto expiration built in yet.
Worked for me, thanks! Just make sure you have the right permissions when you make the key - I just checked the section for repo
36

Add this is your bash_profile:

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

Then run:

git config --global --add url."[email protected]:".insteadOf "https://github.com/" 

Comments

29

From go 1.13 onwards, if you had already configured your terminal with the git credentials and yet facing this issue, then you could try setting the GOPRIVATE environment variable. Setting this environment variable solved this issue for me.

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

3 Comments

This is probably the correct answer to the question that the OP should have asked.
This is the only solution which worked for me. :)
This is the correct answer for go 1.13 or later
26

If you just want go get to work real fast, and move along with your work...

Just export GIT_TERMINAL_PROMPT=1

$ export GIT_TERMINAL_PROMPT=1 $ go get [whatever] 

It will now prompt you for a user/pass for the rest of your shell session. Put this in your .profile or setup git as above for a more permanent solution.

Comments

15

I tried adding this command

export GOPRIVATE=github.com/{private_reponame}/*

and it worked for me

1 Comment

I tried all the above options but this one works like a charm. Here is more documentation about it: medium.com/mabar/…
8

While there are a lot of answers around using SSH authentication for GitHub, the question pertains to the correct usage for go modules. To this end, Luna Lovegood provides the right answer here.

To reiterate, by default Go tries to use a public repository to download packages. We need to specify that it authenticate using SSH for private repos. And to do this, the following can be used:

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

Glob patterns also work, so if you have multiple private repositories, you can add

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

Edit: Correct wording.

2 Comments

I don't think that your last statement is a "regex". It looks like a "glob pattern". Which one is correct? (i.e. if a regex, you probably missed a period, if a pattern, then your statement is incorrect.)
You are correct @AlexisWilke. What I meant was glob pattern.
5

If you configure your gitconfig with this option, you will later have a problem cloning other repos of GitHub

git config --global --add url. "[email protected]". Instead, "https://github.com/" 

Instead, I recommend that you use this option

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

and do not forget to generate an access token from your private repository. When prompted to enter your password, just paste the access token. Happy clone :)

Comments

2

I had the same problem on windows "error: failed to execute prompt script (exit code 1) fatal: could not read Username for 'https://github.com': No error" trying to login to github through the login dialog. When I canceled the dialog git asked me for login and password in the command line and it worked fine.

Comments

1

I faced this error terminal prompts disabled after changing my credentials, Carthage failed to update the dependencies and show this error on terminal.

I just did the simple following steps and it's started working...

  1. Remove old credentials from keychain access
  2. Tried to clone the same repo in different location.
  3. It asked for credentials (username + password) to set.
  4. And then Carthage update worked as before.

Comments

1

Another option is to add the credentials as part of the URL.

To access a repository on GitLab, for example, I use this format for the URL:

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

Comments

1

If the repo is private and needs authentication. Where you need to pass your credentials. The below command would help

 git config --global --add url.https://YOUR_USER_NAME:[email protected]_HOST.com.insteadof https://gitswarm.YOUR_HOST.com 

DOC to create a token

Comments

0

This works for me:

$ GOPRIVATE=myprivtegitlab.com go get myprivategitlab.com/..... 

It also works if you need to install via go install.

Comments

-1

Try this cmd:

GO111MODULE=on GOSUMDB=off go get github.com/examplesite/myprivaterepo 

Or:

go clean -modcache go get github.com/examplesite/myprivaterepo 

Comments

-2

I was able to fix this error disabling the antivirus firewall.

Comments

-3

I get to understand that to save time with GitHub it helps to download it CLI gh

with it there is auth command which i used and it make my life easier

gh auth login 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.