为什么在Windows下,Git不能记住我的密码短语

227
我刚开始使用git,但无法让它记住我的密码。我正在使用已提升权限的cmd.exe,并且我的git主机是github。我按照github上的指南创建了一个ssh密钥,但是我仍然遇到了以下问题:
*\subnus.mvc>git push origin master
Enter passphrase for key '/c/Users/Subnus/.ssh/id_rsa':

我自己没有使用过msysgit,但是pageant身份验证代理可能会有所帮助。 - Cebjyre
1
我尝试了所有的方法,然后我找到了这个,结果很管用。 - Blake Niemyjski
3
Windows 10自带OpenSSH已经有一段时间了。启用ssh-agent服务,使用ssh-add将密钥添加到ssh存储中,并在环境变量中设置GIT_SSH(如果需要),git/ssh将通过ssh-agent记住您的密码。请参阅以下详细说明。 - d3r3kk
1
2019年,我刚在Windows 10上安装了Git,Git只会要求输入密码一次,并且记住了密码。 - Jean-François Fabre
1
@Jean-FrançoisFabre 你可能没有使用OpenSSL。 - RoadRunner
我没有改变任何东西,所以可能我正在使用Windows SSH。 - Jean-François Fabre
14个回答

235

每次我设置新的桌面时都会忘记这些说明,所以我在这里添加了另一个答案,因为我经常遇到这个问题!


对于像我这样不耐烦的用户的快速步骤

  1. 启用OpenSSH身份验证代理服务,并使其自动启动。
    • 更新
    • 使用最新的Windows更新版本10.0.19042.867,我必须重新执行此步骤!
  2. 使用命令行中的 ssh-add将您的SSH密钥添加到代理。
  3. 测试Git集成,如果它仍然要求输入密码,继续进行下一步。
  4. 向您的会话添加环境变量$ENV:GIT_SSH=C:\Windows\System32\OpenSSH\ssh.exe,或永久地添加到您的用户环境。

详细步骤:概述

Windows已经有一段时间与OpenSSH一起发布。 它包含所有必要的部分以使ssh可以与Git一起工作,但似乎仍需要一些TLC才能完全无缝地工作。以下是我成功遵循的步骤,截至Windows版本10.0.18362.449(您可以通过打开cmd.exe shell并输入ver来查看Windows 10版本)。

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

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

  1. 开始-> 输入'Services'并单击出现的Services应用程序。
  2. 在列表中找到OpenSSH身份验证代理服务。
  3. 右键单击OpenSSH身份验证代理服务,选择“属性”。
  4. 启动类型:更改为自动
  5. 单击启动按钮以将服务状态更改为正在运行
  6. 通过单击确定关闭对话框,并关闭服务应用程序。

将您的密钥添加到ssh-agent

  1. 打开您喜欢的shell (我将在此示例中使用Windows Powershell,也适用于Powershell Core)
  2. 将您的SSH密钥添加到ssh-agentssh-add (如果与默认值不同,则可以将密钥的路径作为第一个参数添加)
  3. 在提示时输入您的密码(如有必要)。

尝试Git + SSH

  1. 打开您的shell (再次,我在使用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. 打开您偏好的shell。(我用的是PowerShell)
  2. 将GIT_SSH环境变量设置为适当的ssh.exe$Env:GIT_SSH=$((Get-Command -Name ssh).Source)
  3. 重试上面Try Git + SSH中的步骤。

永久设置GIT_SSH

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

请注意,随着Windows 10的进展和我的学习,这可能会改变为新的步骤/流程。我将尝试保持更新,期待在评论中得到反馈。


32
截至2020年1月31日,这是最完整的答案,至少适用于Windows。不需要安装PUTTY或任何其他软件。 - Jake
如果你在Powershell中使用git,在2021年3月,这就是你需要的答案。SSH支持在Windows中已经有一段时间了。 - rgoliveira
1
如果您正在使用Visual Studio,则由于包含的git.exe是32位的,因此您需要创建指向C:\ Windows \ System32 \ OpenSSH目录链接,并将GIT_SSH环境变量设置为C:\ PathToJunction \ ssh.exe。否则,VS内部git.exe将无法定位ssh.exe,因为32位可执行文件无法直接访问64位系统上的System32。 - Saul
仍然适用于2022年,感谢亲爱的。 - Mo'ath Alshorman
1
@BenediktBöhm 你可以使用mklink命令并加上"/j"开关来创建一个符号链接。System32\OpenSSH的符号链接可以创建在任何目录下。一旦创建完成,将GIT_SSH环境变量指定为符号链接的完整路径加上ssh.exe即可。 - undefined
显示剩余23条评论

228

我知道这个问题已经出现了两年,但我遇到了同样的问题,这里的几个答案并没有完全回答我的问题。以下是三个逐步解决方案,取决于您是否除了msysgit还使用TortoiseGit。

第一种解决方案 假设您使用Windows、msysgit和PuTTY。

  1. 按照说明安装msysgit和PuTTY。

  2. (可选)将PuTTY添加到您的路径中。(如果您不这样做,则下面对PuTTY命令的任何引用都必须加上适当可执行文件的完整路径前缀。)

  3. 如果您还没有这样做,请按照GitHub或Git主机的说明生成密钥哈希。

  4. 同样,如果您还没有这样做,请使用puttygen.exe将您的密钥转换为PuTTY的pageant.exe使用。说明在PuTTY的文档中,此有用的指南以及网络上的其他几个位置。

  5. 运行PuTTY的pageant.exe,打开您的.ppk文件(“添加密钥”),并提供密钥的密码。

  6. 访问Windows的环境变量对话框(右键单击“计算机”,单击“属性”,单击“高级系统设置”或“高级”选项卡,单击“环境变量”)。添加以下环境变量:

    GIT_SSH=C:\full\path\to\plink.exe

    将“C:\full\path\to”替换为PuTTY的完整安装路径,其中包含plink.exe。最好将其添加到“用户变量”部分。同时,请确保您用于plink.exe的路径与您用于Pageant(pageant.exe)的路径匹配。在某些情况下,您可能会安装多个PuTTY,因为它可能随其他应用程序一起安装。从一个安装中使用plink.exe和从另一个安装中使用pageant.exe可能会给您带来麻烦。

  7. 打开命令提示符。

  8. 如果您正在尝试连接到托管在Github.com上的git存储库,则运行以下命令:

    plink.exe git@github.com

    如果您要连接的git存储库托管在其他地方,请将git@github.com替换为适当的用户名和URL。(假设是Github)您将被告知服务器的主机密钥未缓存,并询问是否信任它。回答y。这将把服务器的主机密钥添加到PuTTY已知主机列表中。如果不进行此步骤,则git命令将无法正常工作。按Enter后,GitHub会通知您GitHub不提供shell访问权限。没关系...我们不需要它。(如果您正在连接到其他主机,并且它给您提供了shell访问权限,则最好在不执行其他操作的情况下终止链接。)

  9. 全部完成!现在应该可以从命令行运行git命令。您可能需要让pageant.exe 在启动时自动加载您的.ppk文件,这取决于您需要多频繁。

第二种解决方案 假设使用Windows操作系统,需要安装msysgit和TortoiseGit。

TortoiseGit自带PuTTY可执行文件和一个特殊修改版的plink(名为TortoisePlink.exe),这将使事情更加容易。

  1. 按照说明安装msysgit和TortoiseGit。

  2. 如果您还没有这样做,请按照GitHub或Git主机的说明生成密钥哈希。

  3. 同样,如果您还没有这样做,请使用TortoiseGit的puttygen.exe将密钥转换为可用于TortoiseGit的pageant.exe。在PuTTY的文档中、在第一个解决方案中链接的有用指南中以及网络上的其他几个地方都有说明。

  4. 运行TortoiseGit的pageant.exe,打开您的.ppk文件(“添加密钥”)并提供密钥的密码。

  5. 访问Windows的环境变量对话框(右键单击“计算机”,单击“属性”,单击“高级系统设置”或“高级”选项卡,单击“环境变量”)。添加以下环境变量:

    GIT_SSH=C:\full\path\to\TortoisePlink.exe

    将“C:\full\path\to”替换为TortoiseGit的完整安装路径,其中包含TortoisePlink.exe。最好将其添加到“用户变量”部分。此外,请确保您用于TortoisePlink.exe的路径与您用于Pageant(pageant.exe)的路径匹配。在某些情况下,您可能会有几个PuTTY的安装版本,因为它可能随其他应用程序一起安装。使用来自TortoiseGit安装的TortoisePlink.exe和来自不同应用程序的另一个安装或独立的PuTTY安装的pageant.exe可能会导致问题。

  6. 完成!现在应该可以从命令行运行Git命令了。第一次尝试连接到您的git存储库时,您可能会被告知服务器的主机密钥未缓存,并询问您是否信任该服务器。单击“是”。(这是TortoisePlink.exe在工作。)

    您可能希望让pageant.exe在启动时自动加载您的.ppk文件,这取决于您需要多频繁。

第三种解决方案 假设使用Windows操作系统,msysgit和本地命令提示符。

  1. 安装msysgit
  2. 确保允许在MS-DOS命令提示符下使用git
  3. 运行start-ssh-agent
  4. 输入SSH密码
  5. 完成!现在应该可以在本地命令提示符中使用Git命令了。

3
如果你同时安装了GitExtensions和TortoiseGit,并且它们各自都有自己版本的putty,请确保将GIT_SSH环境变量设置为实际使用的pageant的plink路径。 - shovavnik
17
以防别人遇到这个愚蠢的错误:请确保使用 SSH 远程 URL 格式(git@host:accountname/reponame.git),而不是 HTTPS URL,否则它会继续要求输入密码... - dain
4
注意:方法三已经被上游合并到 msysgit 中,因此您只需在命令行中键入 start-ssh-agent 即可保存您的 SSH 密码短语。 - Matt Clarkson
1
“start-ssh-agent”选项真的很棒,而且非常简单易用!我喜欢它!但是,让我感到困惑的是,为什么这个选项没有在相关的Github文档页面上提到呢? - Domi
7
第三种解决方案仅在命令提示符关闭之前有效,并且仅适用于该命令提示符 - 所有其他CMD仍会要求输入密码。此外,所有其他客户端(VS、VS Code)都无法与远程git通信。 - Dima
显示剩余6条评论

56

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

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

第二个命令将要求输入密码短语,然后就完成了。每次您需要执行的其他操作(以前需要密码短语的操作)都不会再要求输入密码短语(请参见下面屏幕截图中的示例):

在Windows上使用Git bash添加密码短语


2
这在Windows 10的Ubuntu子系统中也可以工作。 - meetar
1
请注意,如果您的密钥对位于其他位置,则可以将“~/.ssh/_rsa”替换为.pem文件的路径。 - alex_danielssen
第二个命令出错:没有这个文件或目录。 - strix25
5
这只适用于当前会话。如果您关闭 Git Bash,您将不得不再次输入密码。 - jabellcu

23

正是我使用“msysgit” shell所需要的。 - arthurakay
1
当我使用Git Bash桌面应用程序时,这对我很有效。我使用了notepad ~/.profile并从该链接中复制粘贴了内容,重新启动了Git Bash,输入了我的密码,获得了利润... - Daryn
我按照“在Git for Windows上自动启动ssh-agent”部分的步骤进行操作(在Win 10上使用git 2.x),但它仍然一直要求我输入密码。遵循接受答案中的第一个解决方案(putty)为我解决了这个问题。 - jakub.g
我已经成功使用在Git for Windows上自动启动ssh-agent的脚本,使得在每次启动后只需要输入一次密语。但是我发现,当我将它添加到~/.profile~/.bashrc时,它并没有起作用。我需要将其添加到~/.bash_profile中,才能被Git Bash on Windows识别和使用。我现在看到@alexander-goncharov的答案也提到了这一点。 - csrowell

13

在问题发布5年、8个月和6天后,另一种额外的解决方案也不是坏主意,因此这里提供一个。

注意:假设您使用的是Windows电脑。

  1. 下载git-credential-winstore
  2. 运行它!如果您在PATH环境变量中有GIT,它应该可以直接工作。如果没有,请运行git-credential-winstore -i C:\Path\To\Git.exe

下次尝试提交到存储库时,您将被提示输入您的凭据。然后就完成了。在您更改密码之前,您将不再被要求输入凭据。


只是为了让您知道……您的凭据存储在Windows凭据管理器中。

您将我的凭据存储在哪里?

此应用程序只是使用现有的Windows凭据管理器来保存您的凭据。您可以通过转到控制面板>用户帐户>Credential Manager并选择“Windows凭据”来查看存储的凭据。以“git:”开头的条目来自git-credential-winstore。


10
这个解决方案似乎只适用于HTTPS仓库,对SSH仓库无效。/生气的表情 - JasonCoder

10
假设你想使用纯Git Bash解决方案,而不使用TortoiseGit或PuTTY。此外,您不想永久存储您的密码短语,因为这几乎与首次生成SSH密钥时未使用密码短语相同。但是您仍然希望使用一些缓存。
为了进行缓存,使用包含在Git Bash分发中的ssh-agent进程。此进程默认情况下不会启动,因此需要首先启动它。要缓存任何SSH密钥,应使用ssh-add命令将其添加到此进程中,该命令将提示您输入密钥的密码短语并将其存储在内存中。
其他解决方案的缺点:
  • GitHub的文章中自动启动ssh-agent会在你启动Git Bash时立即要求输入密码,无论本次会话是否需要使用SSH密钥。如果今天你只是在处理本地repo,那么只有在真正需要时(例如与远程repo交互时)才需要提供密码。
  • 如果你像GitLab的文章中那样使用eval $(ssh-agent -s)启动ssh-agent,你可能已经厌倦了每次都要输入这个命令。很有可能,你已经将这两行代码添加到了你的.bashrc配置文件中以实现自动启动。缺点与上述相同,但还有一个额外的缺点:每次启动新的Git Bash终端时,你都会得到一个额外的ssh-agent进程(GitHub的bash脚本检查该进程是否已经启动)。
  • 与前面两个问题类似,但特别适用于为不同主机使用单独的SSH密钥的情况,例如一个用于GitHub,另一个用于GitLab,这样一次性提供它们就很麻烦和不方便。

因此,这个解决方案适用于那些想知道如何使Git Bash仅在Windows会话期间和确实需要时要求输入一次密码短语的人。它类似于使用GnuPG提交自动签名并使用default-cache-ttl的密码短语管理行为。

仅使用Git Bash配置SSH在需要时仅请求一次密码短语

  1. First, we want to auto-launch the ssh-agent when starting a Git Bash shell. We'll use a modified GitHub's script for that as it checks whether the process has already started, but we don't want it to ssh-add keys right away. This script goes to your ~/.bashrc or ~/.profile or ~/.bash_profile (~ is your User's home directory like C:\Users\Username – run cd ~ and then pwd for the Git Bash to print it out):

    ### 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
    
  2. Now edit or create a ~/.ssh/config file and add an AddKeysToAgent option for each host stanza you want caching to be turned on (you can also turn it on globally by placing the directive at the beginning of the file before all the host declarations):

    # 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
    

    From ssh config man page: If this option is set to yes and a key is loaded from a file, the key and its passphrase are added to the agent with the default lifetime, as if by ssh-add(1).

默认的最大生命周期是永久的,或者直到ssh-agent进程被杀死(可以手动从任务管理器中结束,或者在计算机关闭时)。如果您希望使用有限的超时时间,可以使用ssh-agent的-t参数进行设置。将上面第一步中的bash脚本中的行更改为,例如,30分钟密钥缓存生命周期:
(umask 077; ssh-agent -t 30m >| "$env")

请参见此处了解其他时间格式的限定词。


8

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

ssh-agent也可能有效。尝试运行它并查看是否会记住您的口令。


运行 ssh-keygen -p 应该允许 OP 不设置密码。 - luchosrock
仍在提示输入密码。 - versedi

7
我的情况是我试图推送到一个托管在我们服务器上的存储库。每当我尝试进行推送时,git都会要求我输入密码(注意,是密码,而不是我的私钥口令)。
通过将我的公钥添加到服务器上的授权密钥中,我能够在该服务器上实现免密码推送。因为我的私钥没有 口令 (这是不好的实践!),所以我根本不需要输入任何东西。
以下是将您的公钥添加到服务器上的命令。它假设用户git是服务器上的用户。
cat .ssh/id_rsa.pub | ssh git@GIT_MASTER_IP 'cat >> .ssh/authorized_keys'

您可以通过登录服务器并手动将公钥添加到 ~/.ssh/authorized_keys 文件中来实现相同的效果。


你能把这个转换成一个对于没有Shell访问权限的人可以使用的描述吗?例如,我们应该在授权密钥中使用记事本或类似工具输入什么? - John Little

4
您可以在用户的主目录中(例如C:/Users/youruser)创建一个.bashrc文件,并在其中添加以下内容:
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

4

1
请注意,这是缓存您的 GitHub 密码,而不是 GPG 密钥密码短语。 - Judge2020

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接