为什么git不能记住Windows下的密码


144

我刚刚开始使用git,我无法记住我的密码短语,我使用的是cmd.exe,而我的git主机是github,我在github上创建了类似该指南的ssh密钥

但我仍然得到

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

我自己没有使用过msysgit,但是选拔身份验证代理可能会有所帮助。
Cebjyre

1
我尝试了一切,然后发现了这个方法。
布莱克·尼米斯基

1
Windows 10随OpenSSH一起提供了一段时间。启用ssh-agent服务,使用ssh-add将密钥添加到ssh存储,并GIT_SSH在您的环境中进行设置(如果需要),git / ssh会通过ssh-agent记住您的密码。有关更多详细说明,请参见下面的我的答案。
d3r3kk '19

1
2019年,刚刚在Windows 10上安装了git,而git要求输入一次密码并记住它。
让·弗朗索瓦·法布尔

@Jean-FrançoisFabre您可能未使用OpenSSL。
RoadRunner

Answers:


206

我意识到这个问题已经提出了两年,但是我遇到了同样的问题,这里的几个答案并没有完全为我回答这个问题。这是两个分步解决方案,具体取决于您是否除了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存储库托管在其他位置,请使用适当的用户名和URL 替换git@github.com。(假定为Github)应该通知您服务器的主机密钥未缓存,并询问您是否信任它。用y回答。这会将服务器的主机密钥添加到PuTTY的已知主机列表中。没有此步骤,git命令将无法正常工作。按下Enter键后,Github会通知您Github不提供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:\完整\路径\到\ 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文件,具体取决于您需要使用它的频率。

第三种解决方案假定使用Window,msysgit和本机命令提示符。

  1. 安装msysgit
  2. 确保允许在MS-DOS命令提示符下使用git
  3. start-ssh-agent
  4. 输入SSH密码
  5. 全做完了!Git命令现在应该在本机命令提示符下工作。

3
如果您同时拥有GitExtensions和TortoiseGit,它们每个都有自己的腻子版本,请确保将GIT_SSH环境变量设置为实际使用的选美的plink路径。
shovavnik

15
以防万一有人遇到这个愚蠢的错误:确保您使用的是SSH远程URL格式(git @ host:accountname / reponame.git),而不是HTTPS URL,否则它将继续询问该密码...
dain 2012年

当我运行plink.exe git@github.com时,出现“致命错误:服务器意外关闭网络连接”
Brett

4
注意:方法三已经进入了msysgit的上游,因此您只需start-ssh-agent在命令行中键入以获取它来保存SSH密码即可。
马特·克拉克森

6
第三种解决方案仅在命令提示符关闭之前有效,并且仅对该命令提示符有效-所有其他CMD仍要求输入密码。同样,所有其他客户端(VS,VS代码)也无法与远程git通信。
迪马

21

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


适用于像我这样急躁的用户的快速步骤

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

详细步骤:概述

Windows已经使用OpenSSH交付了一段时间。它包括ssh与Git一起工作所需的所有必要位,但是在100%无缝工作之前,它似乎仍需要一些TLC。从Windows版本10.0.18362.449开始,这是我一直成功执行的步骤(您可以通过打开cmd.exe shell并键入来查看Windows 10版本ver)。

我在这里假设您已经设置了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-agent:(ssh-add 如果密钥与默认密钥不同,则可以将密钥的路径添加为第一个参数)
  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代表您使用。或者,您可以将密码短语永久设置到用户的环境中。

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的进展以及我所了解的更多,这可能会随着新的步骤/过程而改变。我将尝试保持此更新,希望在评论中提供反馈。


3
至少对于Windows,这是截至1/31/2020的最完整答案。无需安装PUTTY或其他任何东西。
杰克

同意 似乎终于有了内置支持。
Eron Lloyd

传说!这解决了我的问题。一段时间以来一直在寻找解决方案,尝试不同的方法,这是解决此问题的最完善的专家
Collin

谢谢您提供了一个不错的答案,很可能使我节省了几个小时的时间。+1
愤怒84年

20

有关需要更多详细说明的任何人,请参见以下页面:http : //help.github.com/working-with-key-passphrases/


正是我使用msysgitshell 所需要的。
arthurakay

1
在使用Git Bash桌面应用程序时为我工作。我使用notepad ~/.profile并复制了该链接中的内容,重新启动了Git Bash,输入了密码,从中获利……
Daryn

我遵循了“在Windows的Git上自动启动ssh-agent”部分(在Win 10上使用git 2.x),但是它仍然一直在询问我密码。从公认的答案的第一个解决方案(putty)之后,这为我解决了这一问题。
jakub.g

20

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

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

它会在第二个命令中要求输入密码,仅此而已。您将需要执行的每个其他操作(一旦需要输入密码)将不会要求您输入密码(请参见下面的屏幕截图中的示例):

在Windows的Git bash中添加密码


2
这也适用于Windows 10中的Ubuntu子系统
。– metar

1
请注意,如果密钥对位于其他位置,则可以用* .pem文件的路径替换〜/ .ssh / * _ rsa
alex_danielssen

13

在问题发布后的5年,8个月零6天,有一个额外的解决方案不是一个坏主意,因此可以继续进行。

注意:假设您正在使用Windows计算机。

  1. 下载git-credential-winstore
  2. 运行!如果您的PATH环境变量中有GIT ,它应该可以正常工作。如果不这样做,请运行git-credential-winstore -i C:\Path\To\Git.exe

下次尝试提交到存储库时,系统将提示您输入凭据。应该是这样。在您更改密码之前,将不再要求您提供凭据。


仅为您所知...您的凭据存储在Windows凭据存储中

您在哪里存储我的凭据?

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


8
该解决方案似乎不适用于SSH存储库,仅适用于HTTPS。/ angryface
JasonCoder

8

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

ssh-agent也可能起作用。尝试运行该命令,看看它是否会记住您的密码。


运行ssh-keygen -p应该允许OP设置无密码短语
luchosrock 2014年

仍然提示输入密码。
versedi

7

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

我的情况是我试图推送到托管在我们一台服务器上的存储库。每当我尝试进行推送时,git都会要求我提供密码(nb-密码,而不是私钥的密码)。

通过将我的公钥添加到服务器上的授权密钥,我可以无密码地推送到该服务器。而且,因为我的私钥上没有密码短语(顺便说一句是不好的做法!),我根本不需要键入任何内容。

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

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

您可以通过登录服务器并在以下位置手动将公钥附加到文件来实现相同目的: ~/.ssh/authorized_keys


您可以将其转换为无法访问shell的人可用的描述吗?例如,我们应该使用记事本或类似的东西放入authorized_keys中吗?
约翰·利特尔


4

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

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

其他解决方案的缺点:

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

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

将SSH配置为仅在需要时使用Git Bash要求一次密码

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

    ### 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. 现在编辑或创建一个~/.ssh/config文件,并AddKeysToAgent为要打开缓存的每个主机节添加一个选项(您也可以通过在所有主机声明之前将指令放置在文件的开头来全局打开该节):

    # 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

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

默认的最大生命周期是永久的,或者直到该ssh-agent进程被终止(通过任务管理器手动关闭或关闭PC时)。如果您希望使用有限超时,则可以使用ssh-agent的-t参数进行设置。从上面的第一步更改bash脚本中的行,例如30分钟的关键高速缓存生存期:

(umask 077; ssh-agent -t 30m >| "$env")

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


3

您可以.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_profilefile代替.bashrc,所以以防万一clone .bashrc

copy .bashrc .bash_profile

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.