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

Nes*_*zer 129 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':
Run Code Online (Sandbox Code Playgroud)

Rob*_*rtB 199

我意识到这个问题将在两年前出现,但我遇到了同样的问题,这里的几个答案并没有完全回答我的问题.这里有两个循序渐进的解决方案,具体取决于您是否使用TortysiseGit以及msysgit.

第一个解决方案假设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:\全\路径\到\ 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命令将无法正常工作.点击进入后,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:\全\路径\为\ 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命令现在应该在本机命令提示符下工作.

  • 以防其他人遇到这个愚蠢的错误:确保你使用SSH远程URL格式(git @ host:accountname/reponame.git)而不是HTTPS URL,否则它会继续要求输入密码...... (15认同)
  • 第三种解决方案仅在命令提示符关闭并且仅针对该命令提示符时才起作用 - 所有其他CMD仍然要求密码短语.此外,所有其他客户端(VS,VS代码)都无法与远程git通信. (5认同)
  • 注意:方法三已经[上传到msysgit](https://github.com/msysgit/msysgit/blob/master/cmd/start-ssh-agent.cmd),所以你只需键入`start-ssh-agent`在命令行中,以保存您的SSH密码. (4认同)
  • 如果您同时拥有GitExtensions和TortoiseGit,每个都有自己的putty版本,请确保将**GIT_SSH**环境变量设置为您实际使用的分页符的plink路径. (3认同)

d3r*_*3kk 93

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


像我这样没有耐心的用户的快速步骤

  1. 启用该OpenSSH Authentication Agent服务并使其自动启动。
    • 更新
    • 使用最新的 Windows 更新,Version 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 才能 100% 无缝地工作。以下是我在 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)并克隆一个 repo。git clone git@github.com:octocat/Spoon-Knife
  2. 如果您看到此提示,请继续下一部分:
Enter passphrase for key '/c/Users/your_user_name/.ssh/id_rsa':
Run Code Online (Sandbox Code Playgroud)

设置GIT_SSH环境变量

在任何会话中,您只需设置此环境变量,密码短语的提示将停止出现,ssh 将ssh-agent代表您使用。或者,您可以将密码永久设置到您的用户环境中。

GIT_SSH仅在当前 shell 中设置:

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

GIT_SSH永久设置

  1. 打开文件资源管理器。开始-> 键入“文件资源管理器”并在列表中单击它。
  2. 右键单击“此电脑”,然后单击“属性”。
  3. 单击“高级系统设置”。
  4. 单击“环境变量...”按钮。
  5. 在“your_user_name 的用户变量”下,单击新建...
  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 的发展和我了解更多信息,这可能会随着新的步骤/程序而改变。我会尽量保持更新,我期待评论中的反馈。

  • 这是截至 2020 年 1 月 31 日最完整的答案,至少对于 Windows 而言。无需安装 PUTTY 或其他任何东西。 (14认同)

Fra*_*anz 19

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


Guy*_*ham 13

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

eval `ssh-agent -s`
ssh-add ~/.ssh/*_rsa
Run Code Online (Sandbox Code Playgroud)

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

在Windows上的Git bash中添加密码短语

希望能帮助到你.

干杯,

盖伊.

  • 这仅适用于当前会话。如果关闭 Git bash,则必须再次输入密码。 (5认同)
  • 这也适用于 Windows 10 中的 Ubuntu 子系统。 (2认同)

Ale*_*fie 12

问题发布后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.

  • 此解决方案似乎不适用于SSH repos,仅适用于HTTPS./愤怒的脸 (8认同)

Dus*_*tin 10

那不是git,而是ssh.

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


Gra*_*erg 7

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

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


hwj*_*wjp 7

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

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

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

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

cat .ssh/id_rsa.pub | ssh git@GIT_MASTER_IP 'cat >> .ssh/authorized_keys'
Run Code Online (Sandbox Code Playgroud)

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


Nik*_*rov 7

假设您想使用纯Git Bash解决方案而不使用 TortoiseGit 或 PuTTY。此外,您不希望永久存储您的密码,因为这与您首先生成没有密码的 SSH 密钥几乎相同。但是你仍然想使用一些缓存。

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

其他解决方案的缺点:

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

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

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

  1. 首先,我们要ssh-agent在启动 Git Bash shell 时自动启动。我们将使用修改后的 GitHub脚本,因为它会检查进程是否已经开始,但我们不希望它立即ssh-add生效。此脚本转到您的~/.bashrcor~/.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
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)

    从 ssh 配置手册如果此选项设置为 yes 并且从文件加载密钥,则密钥及其密码短语将添加到具有默认生命周期的代理中,就像通过 ssh-add(1) 一样。

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

(umask 077; ssh-agent -t 30m >| "$env")
Run Code Online (Sandbox Code Playgroud)

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


Ale*_*rov 5

.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
Run Code Online (Sandbox Code Playgroud)

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

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

copy .bashrc .bash_profile
Run Code Online (Sandbox Code Playgroud)