为什么git在Windows下无法记住我的密码

时间:2008-12-15 23:12:27

标签: windows git ssh cmd

我刚刚开始使用git而且我无法记住我的密码我正在使用cmd.exe提升并且我的git主机是github而且我在github上创建了一个类似于该指南的ssh密钥

但我还是得到了

*\subnus.mvc>git push origin master
Enter passphrase for key '/c/Users/Subnus/.ssh/id_rsa':

14 个答案:

答案 0 :(得分:194)

答案 1 :(得分:18)

对于需要更详细说明的人,请参阅此页面: http://help.github.com/working-with-key-passphrases/

答案 2 :(得分:12)

问题发布后5年,8个月和6天的一个额外解决方案不是一个坏主意,所以这里就是这样。

注意:假设您使用的是Windows计算机。

  1. 下载git-credential-winstore
  2. 跑吧!如果你的PATH环境变量中有GIT,它应该可以正常工作。如果您不这样做,请运行git-credential-winstore -i C:\Path\To\Git.exe
  3. 下次尝试提交存储库时,系统会提示您输入凭据。那应该是它。在您更改密码之前,系统不会再要求您提供凭据。


    仅供您参考...您的凭据存储在Windows凭据存储

      

    您在哪里存储我的凭据?

         

    此应用只使用现有的Windows凭据存储来保存您的凭据。您可以转到控制面板>查看存储的凭据。用户帐户>凭据管理器并选择" Windows凭证"。条目开始" git:"来自git-credential-winstore。

答案 3 :(得分:10)

那不是git,而是ssh。

我不做窗户,但是ssh有一个代理概念,可以为你记住密码。 OS X默认启用此功能。你的ssh客户端可能有办法配置它。

答案 4 :(得分:9)

如果您使用 Windows 下的 Git bash ,您可以执行以下操作:

eval `ssh-agent -s`
ssh-add ~/.ssh/*_rsa

它会在第二个命令中询问密码短语,就是这样。您需要执行的每个额外操作(曾经需要密码短语)都不会要求您输入密码短语(请参阅下面的屏幕截图中的示例):

adding pass phrase in Git bash on Windows

希望它有所帮助。

干杯,

盖。

答案 5 :(得分:7)

如果您为密钥文件设置了密码,则在连接时始终需要输入该密码。如果您创建无密码密钥,则不必每次都输入密钥,但是,任何有权访问密钥文件的人现在都可以连接到您的github帐户。

ssh-agent也可以。尝试运行它,看看它是否会记住你的密码。

答案 6 :(得分:7)

[编辑 - 误读了这个问题,这是对相关问题的回答。留下后代的改写版本]

我的理由是我试图推送到我们其中一台服务器上托管的仓库。每当我尝试推送时,git会问我输入密码(nb - 密码,而不是密码到我的私钥)。

通过将我的公钥添加到服务器上的授权密钥,我能够获得无密码推送到该服务器。并且,因为我的私钥上没有密码短语(这是不好的做法顺便说一下!)我根本不需要输入任何内容。

以下是将公钥添加到服务器的命令。它假定用户git是服务器上的用户。

cat .ssh/id_rsa.pub | ssh git@GIT_MASTER_IP 'cat >> .ssh/authorized_keys'

您可以通过登录服务器并手动将公钥附加到~/.ssh/authorized_keys

上的文件来实现相同的功能

答案 7 :(得分:4)

我意识到这已经过了好几年了,但我偶然发现了这个问题,试图为它找到一个解决方案,我找到了适合各种专业水平的东西,所以我想我会分享。

GitHub提供了一个非常有用的安装程序,使一切变得简单易用:https://help.github.com/articles/caching-your-github-password-in-git/

答案 8 :(得分:4)

每次设置新桌面时,我都会忘记这些说明,因此我在这里添加了另一个答案,因为我经常会偶然发现它!


针对像我这样急躁的用户的快速步骤

  1. 启用OpenSSH Authentication Agent服务并使其自动启动。
  2. 在命令行上使用ssh-add将SSH密钥添加到代理。
  3. 测试git集成,如果仍然需要您的密码,请继续。
  4. 将环境变量$ENV:GIT_SSH=C:\Windows\System32\OpenSSH\ssh.exe添加到会话中,或永久添加到用户环境中。

详细步骤:概述

Windows已经shipping with OpenSSH for some time now.了,它包含ssh与Git一起工作的所有必需位,但是它似乎仍需要一些TLC才能100%无缝地工作。这是自Windows版本10.0.18362.449起成功执行的步骤(打开cmd.exe shell并输入ver即可看到Windows 10版本)。

我在这里假设您已经设置了SSH密钥,并且位于~/.ssh/id_rsa

在Windows 10框中启用ssh-agent服务。

  1. 开始->键入“服务”,然后单击出现的“服务”应用。
  2. 在列表中找到OpenSSH Authentication Agent服务。
  3. 右键单击OpenSSH Authentication Agent服务,然后选择“属性”。
  4. Startup type:更改为Automatic
  5. 单击Start按钮将服务状态更改为Running
  6. 通过单击OK退出对话框,然后关闭“服务”应用。

将密钥添加到ssh-agent

  1. 打开您的首选外壳程序(在此示例中,我将使用Windows Powershell,也适用于Powershell Core)
  2. 将您的SSH密钥添加到ssh-agentssh-add (如果您的密钥与默认密钥不同,则可以将密钥的路径添加为第一个参数)。。 li>
  3. 在出现提示时输入密码。

尝试Git + SSH

  1. 打开您的外壳程序(同样,我正在使用Powershell)并克隆存储库。 git clone git@github.com:octocat/Spoon-Knife
  2. 如果看到此提示,请继续进行下一部分:
Enter passphrase for key '/c/Users/your_user_name/.ssh/id_rsa':

设置您的GIT_SSH环境变量

在任何会话中,您都可以简单地设置此环境变量,并且密码短语的提示将停止出现,并且ssh将代表您使用ssh-agent。另外,您可以将密码短语永久设置到用户的环境中。

仅在当前shell中设置GIT_SSH

  1. 打开您的偏好设置。 (对我来说是Powershell)
  2. 将环境变量GIT_SSH设置为适当的ssh.exe$Env:GIT_SSH=$((Get-Command -Name ssh).Source)
  3. 重试上述尝试Git + SSH 中的步骤。

要永久设置GIT_SSH

  1. 打开文件资源管理器。开始->键入“文件资源管理器”,然后在列表中单击它。
  2. 右键单击“此PC”,然后单击“属性”。
  3. 单击“高级系统设置”。
  4. 单击“环境变量...”按钮。
  5. 在“您的用户名的用户变量”下,单击“新建...”。
  6. Variable name:字段设置为GIT_SSH
  7. Variable value:字段设置为path-to-ssh.exe(通常为C:\Windows\System32\OpenSSH\ssh.exe)。
  8. 单击“确定”关闭“新用户变量”对话框。
  9. 单击“确定”关闭“环境变量”对话框。
  10. 重试上述尝试Git + SSH 中的步骤。

请注意,随着Windows 10的进展以及我所了解的更多,这可能会随着新的步骤/过程而改变。我将尝试保持此更新,希望在评论中提供反馈。

答案 9 :(得分:3)

如果您不介意将密码存储在纯文本中并使用TortoiseGit,则可以使用更多更简单的解决此问题的方法。

只需在您的用户个人资料目录中创建一个_netrc文件即 - 在Windows 7中,它将是C:\Users\MyName\_netrc。此文件将以以下格式存储您的登录信息:

machine bitbucket.org login thisismyname password p455w0rD
machine bitbucket.org login another_account password pwdpwdPWd
machine github.com login thisismynameagain password p455w0rD

我正在使用TortoisePLink作为SSH客户端,它可以完美运行。

答案 10 :(得分:1)

可以尝试添加-k arg;

ssh-add -k ~/.ssh/id_rsa

答案 11 :(得分:1)

您可以在用户的​​主目录中创建一个.bashrc文件,例如C:/Users/youruser,并放在那里:

env=~/.ssh/agent.env

agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }

agent_start () {
    (umask 077; ssh-agent >| "$env")
    . "$env" >| /dev/null ; }

agent_load_env

# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)

if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
    agent_start
    ssh-add
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
    ssh-add
fi

unset env

每次bash运行后都会执行此脚本。因此,当git-bash启动时,您只需输入一次密码!

某些版本的bash需要.bash_profile文件而不是.bashrc,所以以防万一克隆.bashrc

copy .bashrc .bash_profile

答案 12 :(得分:0)

让我们假设您只想使用纯 Git Bash 解决方案,而不使用TortoiseGit或PuTTY。另外,您也不想永久存储密码短语,因为它几乎与首先生成没有密码短语的SSH密钥一样。但是您仍然想使用一些缓存。

出于缓存目的,使用了ssh-agent进程,该进程包含在Git Bash发行版中。此过程默认情况下未启动,因此需要首先启动。对于要缓存的任何SSH密钥,应使用ssh-add命令将其添加到此过程中,该命令将提示您输入密钥的密码并将其存储在内存中。

其他解决方案的缺点:

  • GitHub's中的文章一样,自动启动ssh-agent在启动Git Bash时从一开始就要求输入密码,无论您是否需要在此会话中使用SSH密钥。如果您今天正在使用本地存储库,则可能只希望在真正需要时(例如,与远程存储库进行交互时)提供密码。
  • 如果您像ssh-agent中的GitLab's文章中那样启动eval $(ssh-agent -s),您可能会讨厌每次都键入该内容。最终,您有可能将这两行添加到.bashrc配置中以自动启动。缺点与上述相同,外加一个额外的缺点:每次启动新的Git Bash终端时,您将获得一个额外的ssh-agent进程(GitHub的bash脚本检查该进程是否已经开始)。
  • 就像上面的两个一样,但是特别是当您为不同的主机使用单独的SSH密钥时,例如一个用于GitHub,另一个用于GitLab,因此同时提供它们既烦人又不方便。

因此,该解决方案适合那些想知道如何使Git Bash在每个Windows会话中仅在真正需要时要求一次密码的人。它类似于使用auto-signing进行GnuPG提交default-cache-ttl进行密码短语管理的行为。

仅在使用Git Bash的情况下将SSH配置为要求一次密码短语

  1. 首先,我们要在启动Git Bash shell时自动启动ssh-agent。为此,我们将使用经过修改的GitHub的script,因为它会检查进程是否已经开始,但是我们不希望它立即ssh-add键。该脚本转到您的~/.bashrc~/.profile~/.bash_profile~是用户的主目录,如C:\Users\Username –运行cd ~,然后运行{{ 1}},以便Git Bash将其打印出来):

    pwd
  2. 现在编辑或创建一个### Start ssh-agent env=~/.ssh/agent.env agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; } agent_start () { (umask 077; ssh-agent >| "$env") # use -t here for timeout . "$env" >| /dev/null ; } agent_load_env # agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?) if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then agent_start fi unset env 文件,并为要启用缓存的每个主机节添加一个 ~/.ssh/config 选项(也可以将其打开通过将该指令放在文件的开头(在所有主机声明之前)在全局上启用):

    AddKeysToAgent
      

    来自ssh config man page:如果此选项设置为yes并且从文件中加载了密钥,则该密钥及其密码将以默认生存期添加到代理中,就像ssh-add(1)一样。

默认的最大生存期是永久的,或者直到# GitHub.com Host github.com Preferredauthentications publickey IdentityFile ~/.ssh/id_ed25519_github AddKeysToAgent yes # GitLab.com Host gitlab.com Preferredauthentications publickey IdentityFile ~/.ssh/id_ed25519_gitlab AddKeysToAgent yes 进程被杀死为止(可以通过任务管理器手动执行,也可以在PC关闭时进行)。如果希望使用有限超时,则可以使用ssh-agent的-t参数进行设置。从上面的第一步更改bash脚本中的行,例如30分钟的密钥缓存有效期:

ssh-agent

有关其他时间格式限定符,请参见here

答案 13 :(得分:0)

确保您的~/.ssh/config包含

UseKeychain yes

防止 ssh-add 持久化到 ssh-agent