Git push需要用户名和密码

时间:2011-07-03 20:25:17

标签: authentication github git-push git-pull git-clone

我从我的Github帐户克隆了一个git存储库到我的电脑。

我想使用我的电脑和笔记本电脑,但有一个Github帐户。

当我尝试使用我的电脑从Github推送或拉出时,它需要用户名和密码,但在使用笔记本电脑时则不行!

每次与原点互动时,我都不想输入用户名和密码。 我在这里缺少什么?

25 个答案:

答案 0 :(得分:1742)

常见错误是使用默认值(HTTPS)而不是SSH进行克隆。您可以通过转到存储库,单击“克隆或下载”,然后单击URL字段上方的“使用SSH”按钮并更新原始遥控器的URL来更正此问题:

git remote set-url origin git@github.com:username/repo.git

GitHub记录了这一点:Switching remote URLs from HTTPS to SSH

答案 1 :(得分:273)

使用Git存储库进行永久性身份验证

运行以下命令以启用credential caching

$ git config credential.helper store
$ git push https://github.com/owner/repo.git

Username for 'https://github.com': <USERNAME>
Password for 'https://USERNAME@github.com': <PASSWORD>

使用时还应指定缓存过期

git config --global credential.helper 'cache --timeout 7200'

启用凭据缓存后,它将缓存 7200秒(2小时)

答案 2 :(得分:128)

我遇到了同样的问题,我发现最简单的解决方案是使用SSH URL而不是HTTPS:

ssh://git@github.com/username/repo.git

而不是这个:

https://github.com/username/repo.git

您现在可以使用 SSH Key而不是usernamepassword进行验证。

答案 3 :(得分:116)

除了更改为SSH之外,如果您不介意以明文形式输入密码,也可以继续使用HTTPS。把它放在你的~/.netrc中它不会要求你的用户名/密码(至少在Linux和Mac上):

machine github.com
       login <user>
       password <password>

添加(请参阅VonC的第2条评论):在Windows上,文件名为%HOME%\_netrc

如果您想加密,还请阅读VonC的第一条评论。

另外添加(请参阅user137717的评论),如果你有 git 1.7.10或更新版,你可以使用它。

Cache your github password in git using a credential helper

  

如果您使用HTTPS克隆GitHub存储库,则可以使用   凭证助手告诉Git记住你的GitHub用户名和   每次与GitHub交谈时都会输入密码。

这也适用于Linux,Mac和Windows。

答案 4 :(得分:77)

对于那些对以前的答案感到困惑的外行人,你可以这样做:

git remote -v

会回复类似

的内容
origin  https://yourname@github.com/yourname/yourrepo.git (fetch)
origin  https://yourname@github.com/yourname/yourrepo.git (push)

然后你可以运行许多其他建议的命令,但现在你知道你的名字和你的回复了,所以你可以从上面剪切并粘贴yourname/yourrepo.git

git remote set-url origin git@github.com:yourname/yourrepo.git

答案 5 :(得分:52)

如果您正在使用ssh并且您的私钥使用密码加密,那么 当您使用Git进行网络操作时,仍会提示您输入私钥的密码/密码< / em> ,例如pushpullfetch

使用ssh-agent保存私钥密码/密码凭证

如果您希望每次都不必输入密码,则可以使用ssh-agent为每个终端会话存储一次私钥密码凭据,正如我在my answer to Could not open a connection to your authentication agent中所解释的那样:

$ eval `ssh-agent -s`
$ ssh-add

在Windows msysgit Bash中,您需要评估ssh-agent的输出,但我不确定您是否需要在其他开发环境和操作系统中执行相同操作。

ssh-add在名为.ssh的主id_rsa文件夹中查找私钥,这是默认名称,但您可以将文件路径传递给具有不同名称的密钥。< / p>

杀死座席

完成终端会话后,您可以使用kill flag ssh-agent关闭-k

$ ssh-agent -k

正如ssh-agent manual

中所述
-k
     

终止当前代理(由SSH_AGENT_PID环境变量给出)。

可选超时

此外,它可以采用可选的超时参数,如下所示:

$ ssh-add -t <timeout>

其中<timeout>的格式<n>h<n>小时,<n>m<n>分钟,依此类推。

根据ssh-agent manual

-t life
     

为添加的身份的最长生命周期设置默认值   给代理人。寿命可以以秒或以秒为单位指定   sshd_config(5)中指定的时间格式。指定的生命周期   对于具有ssh-add(1)的标识,将覆盖此值。没有   此选项的默认最长生命周期是永久的。

See this page for more time formats

Cygwin用户的安全警告

Cygwin用户应该知道potential security risk with using ssh-agent in Cygwin

  人们应该认识到这一点   在cygwin [1]下ssh-agent的潜在危险,虽然在本地   netstat和远程portscan它不会出现在指定的端口   任何人都可以访问/ tmp / ssh-foo吗?

[1]: http://www.cygwin.com/ml/cygwin/2001-01/msg00063.html

cited link

  

然而,请注意,cygwin的unix域套接字 FUNDAMENTALLY   INSECURE ,因此我强烈 DISCOURAGE 使用ssh-agent   cygwin的。

     

在cygwin下运行ssh-agent时会创建AF_UNIX套接字   /tmp/ssh-$USERNAME/目录。在cygwin下AF_UNIX套接字是   通过AF_INET套接字模拟。你可以很容易地看到,如果你看   通过记事本进入/tmp/ssh-$USERNAME/agent-socket-*文件。你会看到的   

之类的东西
!<socket >2080
     

然后运行netstat -a并惊喜!你有一些程序在听   端口2080.它是ssh-agent。当ssh收到RSA挑战时   服务器,它指的是相应的/tmp/ssh-$USERNAME/agent-socket-*   (在cygwin下,在我们的例子中,这意味着它将打开连接到   localhost:2080)并要求ssh-agent处理RSA质询   它有私钥,然后它只是传递从中收到的响应   ssh-agent到服务器。

     在unix下,这样的场景没有问题,因为unix内核   程序尝试访问AF_UNIX套接字时检查权限。对于   但是,AF_INET套接字的连接是匿名的(读取   “不安全”)。想象一下,你运行了cygwin ssh-agent。   恶意黑客可能会端口扫描你的盒子,找到使用的开放端口   ssh-agent,打开与ssh服务器的连接,接收RSA质询   从它,通过他发现的开放端口发送给你的ssh-agent,接收RSA   响应,发送到ssh服务器,瞧,他成功登录   像你一样到你的服务器。

答案 6 :(得分:46)

来源:Set Up Git

以下命令会将密码保存在内存中一段时间 (对于 git 1.7.10 或更新。)

$ git config --global credential.helper cache
# Set git to use the credential memory cache

$ git config --global credential.helper 'cache --timeout=3600'
# Set the cache to timeout after 1 hour (setting is in seconds)

答案 7 :(得分:30)

使用 https 进行git pull&amp;推送,只为您的项目配置remote.origin.url,以避免每次推送时输入用户名(或/和密码)。

如何配置remote.origin.url

Url format:
    https://{username:password@}github.com/{owner}/{repo}

Parameters in url:
* username
    optional, the username to use when need authentication,
    if specified, no need to enter username again when need authentication,
    don't use email, use your username that has no "@", otherwise the url can't be parsed correctly,
* password
    optional, the password to use when need authentication,
    if specified, no need to enter password again when need authentication,
    tip:
        this value is stored as plain text, so for security concern, don't specify this param,
* 

e.g
    git config remote.origin.url https://eric@github.com/eric/myproject


@Update - 使用ssh

我认为使用ssh协议是比https更好的解决方案,即使设置步骤稍微复杂一些。

粗略步骤:

  • 使用命令创建ssh密钥,例如linux上的ssh-keygen,在Windows msysgit上提供类似的命令。
  • 将私钥保存在适当位置的本地计算机上,例如~/.ssh。并通过ssh-add命令将其添加到ssh代理。
  • 将公钥上传到git服务器。
  • 将git存储库的remote.origin.url更改为ssh样式,例如git@gitlab.com:myaccount/myrepo.git
  • 然后在拉或推时,无需输入用户名或密码。

<强>提示:

  • 如果您的ssh密钥有密码,则默认情况下,您需要在每次重启机器后首次使用密钥时输入密码。

@Update - 在httpsssh协议之间切换。

只需更改remote.origin.url就足够了,或者您可以直接编辑repo_home/.git/config来更改值(例如在linux上使用vi)。

通常我为每个协议添加一行,并使用#注释掉其中一个。

<强> e.g

[remote "origin"]
        url = git@gitlab.com:myaccount/myrepo.git
        # url = https://myaccount@gitlab.com/myaccount/myrepo.git
        fetch = +refs/heads/*:refs/remotes/origin/*

答案 8 :(得分:15)

您可以在Git中缓存GitHub密码:

只需按照github official documentation的说明进行操作。

按照上述链接中的说明操作后,您应该可以在不每次输入用户名/密码的情况下向/从您的仓库进行推/拉。

答案 9 :(得分:8)

对我有用的是编辑.git/config并使用

[remote "origin"]
        url = https://<login>:<password>@gitlab.com(...).git

不言而喻,这是一种存储密码的不安全方式,但有些环境/情况可能不是问题。

答案 10 :(得分:7)

这是另一种选择:

而不是写

git push origin HEAD

你可以写:

git push https://user:pass@yourrepo.com/path HEAD

显然,对于大多数shell,这将导致密码在历史记录中被缓存,因此请记住这一点。

答案 11 :(得分:6)

如果您已在Github帐户上启用了2FA ,则您的常规密码将无法使用,但是您可以生成一个Personal Access Token并用它代替它。< / p>

访问GitHub(https://github.com/settings/tokens/new)中的Settings-> Developer Settings-> Personal Access Tokens页面,并使用所有 Repo 生成新令牌权限:

generate GitHub personal access token

然后页面将显示新的令牌值。保存此值并在推送到GitHub上的存储库时使用它代替密码:

> git push origin develop
Username for 'https://github.com': <your username>
Password for 'https://<your username>@github.com': <your personal access token>

答案 12 :(得分:4)

你基本上有两个选择。

如果您在两台计算机上使用相同的用户,则需要将.pub密钥复制到PC,因此github知道您是同一个用户。

如果您为PC创建了一个新的.pub文件,并希望将这些计算机视为不同的用户,则需要在github网站上注册新的.pub文件。

如果这仍然不起作用,可能是因为没有正确配置ssh并且ssh无法找到密钥的位置。尝试

ssh -vv username@github.com

获取有关SSH失败原因的更多信息。

答案 13 :(得分:4)

HTTPS更新:

Github推出了一个新的Windows程序,可以在您使用HTTPS时存储您的凭据:

使用:

here

下载该程序

运行程序后,它将编辑您的.gitconfig文件。如果您有几个,请重新检查它是否编辑了正确的.gitconfig。如果它没有编辑正确的,请将以下内容添加到.gitconfig

[credential]
    helper = !'C:\\Path\\To\\Your\\Downloaded\\File\\git-credential-winstore.exe'

注意[credential]之后的换行符。这是必需的。

打开命令行客户端并尝试git push origin master一次。如果它要求您输入密码,请输入密码即可。密码已保存!

答案 14 :(得分:3)

列出您当前的 SSH 密钥:

ls -l ~/.ssh

生成新的 SSH 密钥:

ssh-keygen -t ed25519 -C "your_email@example.com"

您应该将 your_email@example.com 替换为您的 GitHub 电子邮件的位置 地址。
当提示Enter a file in which to save the key时,按 输入
Enter passphrase (empty for no passphrase) 上 - 只需按 输入(输入空密码)。
再次列出您的 SSH 密钥:

ls -l ~/.ssh

文件 id_ed25519id_ed25519.pub 现在应该已添加。
在后台启动 ssh-agent:

eval $(ssh-agent -s)

将您的 SSH 私钥添加到 ssh-agent:

ssh-add ~/.ssh/id_ed25519

接下来将公钥输出到终端屏幕:

cat ~/.ssh/id_ed25519.pub

将输出复制到剪贴板 (Ctrl + 插入).
转到 https://github.com/<your-github-username> 并使用您的 用户名和密码。
点击右上角的 GitHub 头像,然后点击设置。 在左侧窗格中,单击 SSH 和 GPG 密钥。 点击绿色按钮新建 SSH 密钥 并将公共 SSH 密钥粘贴到标记为 Key 的文本区域中。 使用描述性的标题来说明您将使用哪台计算机 使用此 SSH 密钥。点击添加 SSH 密钥


如果您当前的本地存储库是使用 http用户名 创建的, 它需要重新创建,以便与 SSH 兼容。
首先检查以确保您有一个干净的工作树 以免丢失任何工作:

git status

然后cd ..到父目录和rm -fr <name-of-your-repo>
最后克隆一个使用 SSH 而不是用户名/密码的新副本:

git clone git@github.com:[your-github-username]/[repository-name].git

参考文献:
https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent
https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/adding-a-new-ssh-key-to-your-github-account

答案 15 :(得分:2)

对于Windows git用户,运行git config --global credential.helper store后,如果仍然提示输入密码,则最好检查配置写入的位置。使用此命令

git config --list --show-origin

在我的情况下,手动编辑配置文件'C:\ Program Files \ Git \ mingw64 \ etc \ gitconfig',添加以下文本,即可使用。

[credential] helper = store

答案 16 :(得分:2)

我也有同样的问题。

所以从我的项目中更改.git / config文件

url = https://github.com/<your-user-here>/<your-repo-here>

url = git@github.com:<your-user-here>/<your-repo-here>

并将ssh公钥添加到正在设置的git配置文件中。

用于ssh公钥

cat ~/.ssh/id_rsa.pub

答案 17 :(得分:1)

您需要执行两个步骤 -

1) git remote remove origin
2) git remote add origin git@github.com:NuggetAI/nugget.git

请注意,git网址是ssh网址,而不是https网址。您可以从此处选择。

enter image description here

答案 18 :(得分:1)

这对我有用:

git remote set-url origin https://username@github.com/username/reponame.git

示例:

git remote set-url origin https://jsmith@github.com/jsmith/master.git

答案 19 :(得分:1)

直接更新您的git配置文件:如果您不想记住精美的命令

在您喜欢的文本编辑器中打开.git/config文件。它将位于您克隆的文件夹中或执行git init的存储库中。进入该存储库。 .git是一个隐藏文件夹,按ctrl + h应该显示该隐藏文件夹(终端中的ls -a)。

这里是.git/config文件的示例,复制并粘贴这些行,并确保使用您的git信息更新这些行。

[user]
        name = Tux
        email = tux@gmail.com
        username = happy_feet

[remote "origin"]
        url = https://github.com/happy_feet/my_code.git
        fetch = +refs/heads/*:refs/remotes/origin/*

使用以下格式更改SSH的url部分

url = git@github.com:happy_feet/my_code.git

上述格式在github或bitbucket等各种git远程服务器上不会更改,如果您使用git进行版本控制,则上述格式相同)

注意::SSH连接到远程git存储库的方式将要求您将公共SSH密钥添加到git远程服务器(如github或bitbucket,请在设置页面上搜索) SSH密钥

要了解如何生成SSH密钥,请参阅: https://confluence.atlassian.com/bitbucketserver/creating-ssh-keys-776639788.html

答案 20 :(得分:0)

如果ssh密钥或.netrc不适合您,那么另一个可以为您工作的简单但不太安全的解决方案是git-credential-store - Helper将凭据存储在磁盘上

git config --global credential.helper store

默认情况下,凭据将保存在~/.git-credentials中。它将被创建和写入。

请注意,使用此帮助程序会将未加密的密码存储在磁盘上,仅受文件系统权限的保护。如果这可能不是一个可接受的安全权衡。

答案 21 :(得分:0)

正如许多用户所说,您只需将您的git存储库URL从https更改为SSH。

如果您尚未在计算机中生成SSH密钥,那么您将不得不这样做。

作为附加信息,在执行此更改后,我仍然遇到相同的错误:权限被拒绝。

就我而言,问题是我使用Windows Shell执行ngh命令;由于此命令应打开请求SSH短语的提示,并且Windows Shell不会打开此类提示,因此身份验证失败。

所以,我只需要打开git shell并在那里执行ngh命令,每次请求它时都会在提示符中输入SSH短语并且“voilà”......它运行正常!

答案 22 :(得分:0)

    # create the company identity file
    ssh-keygen -t rsa -b 4096 -C "first.last@corp.com"
    # save private key to ~/.ssh/id_rsa.corp, 
    cat ~/.ssh/id_rsa.corp.pub # copy paste this string into your corp web ui security ssh keys

    # create your private identify file
    ssh-keygen -t rsa -b 4096 -C "me@gmail.com"
    # save private key to ~/.ssh/id_rsa.me, note the public key ~/.ssh/id_rsa.me.pub
    cat ~/.ssh/id_rsa.me.pub # copy paste this one into your githubs, private keys

    # clone company internal repo as follows
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git clone git@git.in.corp.com:corp/project.git

    export git_msg="my commit msg with my corporate identity"
    git add --all ; git commit -m "$git_msg" --author "MeFirst MeLast <first.last@corp.com>"
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git push 

    # clone public repo as follows
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git clone git@github.com:acoolprojectowner/coolproject.git

    export git_msg="my commit msg with my personal identity"
    git add --all ; git commit -m "$git_msg" --author "MeFirst MeLast <first.last@gmail.com>"
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.me -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git push 

    # stop :: how-to use different ssh identity files

答案 23 :(得分:0)

如果您克隆了HTTPS而不是SSH,并且在pull,push和fetch上遇到用户名和密码提示的问题。您可以简单地为UBUNTU解决此问题

步骤1: 移至根目录

cd ~/

创建一个.git-credentials文件

与您usename passwordgithosting URL一起将此内容添加到该文件中

https://user:pass@example.com

然后执行命令

git config --global credential.helper store

现在,您可以轻松地从存储库中进行推送并获取所有详细信息。

答案 24 :(得分:0)

如果您在Windows下使用git(例如git bash) (如果你不想从https切换到ssh)

你也可以使用https://github.com/Microsoft/Git-Credential-Manager-for-Windows

此应用程序将为您保留用户名和密码...