【问题标题】:"Cannot spawn ssh" when connecting to Github, but ssh -T git@github.com works?连接到 Github 时“无法生成 ssh”,但 ssh -T git@github.com 有效吗?
【发布时间】:2022-04-07 21:18:38
【问题描述】:

我很难让 Github(+Netbeans 工作)。

我想使用 ssh 和 git(在 Windows 7 上)来提交或克隆项目,但我不断收到此错误消息:

$ git clone git@github.com:USER/PROJECTNAME.git
error: cannot spawn C:\Program Files (x86)\Git\bin\ssh.exe: No such file or directory
fatal: unable to fork

注意:目前,我的GIT_SSH 环境变量指向C:\Program Files (x86)\Git\bin\ssh.exe,但我也尝试过C:\Program Files (x86)\Git\bin,将其完全擦除,指向putty/plink 的文件夹,并指向到他们的可执行文件,但仍然是相同的消息。

当我测试连接时一切正常:

$ ssh -T git@github.com
Hi USER! You've successfully authenticated, but GitHub does not provide shell access.

我做错了什么?如果我首先在目录中执行git init 会有所不同吗?

编辑

这没有帮助:

setting GIT_SSH to plink.exe and adding plink's path to PATH

**编辑 2 **

GIT_TRACE=2 的命令结果

$ GIT_TRACE=2 git clone git@github.com:XXX/AffableBean
trace: built-in: git 'clone' 'git@github.com:XXX/AffableBean'
Cloning into 'AffableBean'...
trace: run_command: 'Plink.exe' '-batch' 'git@github.com' 'git-upload-pack '\''XXX/AffableBean'\'''
error: cannot spawn Plink.exe: No such file or directory
fatal: unable to fork

【问题讨论】:

  • GIT_SSH 有没有转义空格?在您的第二个示例中,您似乎可以直接运行 ssh,那在您的路径中吗?我猜如果您的 PATH 中有 ssh,则不需要设置 GIT_SSH 变量。
  • @StephenNewell 即使我有 ssh(或 PATH 中的任何其他 ssh 客户端),我仍然会收到相同的消息。我什至尝试取消设置 GIT_SSH 变量,但它仍然无法正常工作。
  • 如果 GIT_SSH 未设置,您会收到什么错误消息?看起来 ssh 本身可以正常工作,但 git 出于任何原因都无法正常运行。
  • @StephenNewell 每次收到消息时,例如:error: cannot spawn C:\Putty\plink.exe: No such file or directory fatal: unable to fork 但当 GIT_SSH 未设置时,例如...plink.exe 更改为 ssh
  • 包含ssh 的文件夹在PATH 中是否正确?

标签: git version-control ssh github


【解决方案1】:

到目前为止,没有一个答案对我有用。最终为我解决了这个问题的是从我的GIT_SSH 变量中删除引号,并且根本不转义任何字符,没有 MSYS 路径样式(例如/c/path\ to\ putty/plink.exe)。正常输入路径即可,Git处理引用。

set GIT_SSH=C:\path to putty\plink.exe

就是这样。使用 GIT_TRACE 时,您可以看到变量在结果命令中被引用,因此:

  1. 添加的双引号改变了传递给命令的字符串,

  2. 路径用单引号括起来,所以空格没问题。

希望对某人有所帮助。

【讨论】:

  • 重要提示:请注意,如果您明确尝试使用 Windows 的内部、本机、OpenSSH 功能(自 Windows 10 1803 起可用),这是不正确的。在这种情况下,正确的参考将是:C:\Windows\SysNative\OpenSSH\ssh.exe 此外,如果您尝试将内容与 Visual Studio 2022 集成,则在 %UserProfile%/.gitconfig 中指定它的正确方法, 严格、准确、准确地说:[core] sshcommand = '"C:\\Windows\\SysNative\\OpenSSH\\ssh.exe"' 请注意双引号和“SysNative”周围的单引号。
  • @breakpoint 你能解释一下为什么这条非常规的路径吗?给一些文档的指针?我说非常规,因为它与实际的 ssh.exe 文件所在的位置不同
【解决方案2】:

在我的情况下,将 GIT_SSH 设置为:

GIT_SSH=/c/Program\ Files\ (x86)/Git/bin/ssh.exe

曾在 git bash 中工作。

编辑:这应该不再需要了。而是使用 Windows 凭据管理器。谢谢@breakpoint

【讨论】:

  • 谢谢。这对我有一个小的修改。我在 Windows 上使用 Git Bash。 GIT_SSH=/c/Program\ Files\\(x86\)/Git/bin/ssh.exe 。括号前也需要反斜杠。
  • 这对我也有用。在 Windows 10 上运行 Git Bash 并显示错误消息 error: cannot spawn c:\Program Files (x86)\GitExtensions\PuTTY\: No such file or directory fatal: unable to fork
  • @DanPersson 当然不是这样的文件或目录,因为第一个空格会破坏整个路径,在这种情况下,您需要在每个空格之前使用 \,或者只是使用 GIT_SSH="c :\Program Files (x86)\Git\bin\ssh.exe" 就是这样。
  • Windows 中程序和文件之间的这个空间真是个笑话。我听说过 20 多年了。
  • 同样,对于 Windows 10 build 1803 或更高版本,这不再正确。我知道我在这里留下了很多 cmets,但你们都知道多年后遇到过时的文档并尝试应用它是什么感觉。 Windows 现在 NATIVELY SUPPLIES OpenSSL,你会想要使用它。一方面,这是绑定到凭据管理器的唯一干净方法(您不应该手动运行 ssh-agent;它现在是一项服务,只需将其设置为自动启动)。请参阅上面的我的 cmets。
【解决方案3】:

您是否尝试将 ssh.exe 安装到不包含空格的路径?您是否测试过引用反斜杠是否有效 (\\)?

您也可以尝试GIT_TRACE=2 git clone <...>,它应该会显示 git 尝试运行以进行连接的命令和参数。

【讨论】:

  • “安装 ssh.exe”是什么意思?哪个 ssh 所以你的意思是这里?开放SSH? Git 的 ssh 吗?
  • 我的意思是错误消息中提到的Git\bin\ssh.exe。对我来说,路径的引用似乎有问题,因此确保 ssh.exe 安装在没有空格的路径中可能会有所帮助。
  • 我应该在哪里测试引用反斜杠?在路径中?如果不是那么是?
  • 我会先测试将 git 的 ssh.exe 安装到没有空格的路径(例如“c:\git”)!看到这条评论:code.google.com/p/msysgit/issues/detail?id=313#c3
  • 我已经尝试过:我已将ssh.exe 复制到C:\Putty 并将我的GIT_SSH 设置为C:\Putty\ssh.exe 并且仍然:我明白了:http://pastebin.com/fXBvT3X8 P.S.我也试过C:\\Putty\\ssh.exe
【解决方案4】:

就我而言,我能够通过在 CMD 终端中创建目录连接并重置 GIT_SSH 来解决该问题。

通过在 Git Bash 终端中运行此 Windows CMD 命令来查找 ssh 命令的路径。

$ where ssh
C:\Program Files\Git\usr\bin\ssh.exe

在 CMD 终端中为原始 Git 目录创建一个没有空格的连接。

mklink /J \git "\Program Files\Git"

然后编辑 GIT_SSH 环境变量以使用联结。对于 Windows 7,控制面板 > 系统和安全 > 系统 > 高级系统设置。

C:\git\usr\bin\ssh.exe

在将 PuTTY 使用切换到 OpenSSH 后,我以某种方式遇到了这个问题。 git 版本是 2.21.0.windows.1。我希望这会有所帮助。

【讨论】:

  • 如果您在 PHPStorm IDE 的控制台中收到此消息,这可能还不够。如果引用基于 Linux 的系统,例如“/home/<yourusername/.ssh 未找到”,而此目录存在于C:\Users\<your username 下,我可能会进一步失败。多可惜。我找不到设置它的环境变量。
  • 重要提示:请注意,如果您明确尝试使用 Windows 的内部、本机、OpenSSH 功能(自 Windows 10 1803 起可用),这是不正确的。在这种情况下,正确的参考将是:C:\Windows\SysNative\OpenSSH\ssh.exe 此外,如果您尝试将内容与 Visual Studio 2022 集成,则在 %UserProfile%/.gitconfig 中指定它的正确方法, 严格、准确、准确地说:[core] sshcommand = '"C:\\Windows\\SysNative\\OpenSSH\\ssh.exe"' 请注意双引号和“SysNative”周围的单引号。
【解决方案5】:

多么史诗般的跋涉!以上没有对我有用,但这是我的解决方案。 在那次手术之前,我总是得到:

错误无法生成 ssh:权限被拒绝。

Pre-req:Git for Windows,安装在例如C:\Program Files\Git

  • Windows 键
  • 输入“env”+回车
  • [Environment Variables] 按钮,系统变量部分
  • 编辑或添加GIT_SSH=ssh
  • 当您在该对话框中时,现在编辑 Path,同一部分
  • 添加值 C:\Program Files\Git\usr\bin,或您的 Git ssh.exe 二进制文件所在的任何位置。
  • 我坚持你的 git ssh.exe 二进制文件不是你的 OpenSSH 一个,现在随 Windows 10 一起提供,@987654328 @
  • 现在是关键步骤:使用Move up 使Git ssh.exe 优先于OpenSSH。 (见下图)
  • 确定一切,然后重新加载您的工作控制台

git push 现在应该可以工作了。

注意:

  • 不需要符号链接或连接
  • 不更改任何 Windows 权限
  • 不逃避任何空间或任何东西
  • 不使用双引号

【讨论】:

  • 很好的结果:这一举措也使它在 PHP Storm 中免费工作。
【解决方案6】:

这真的很尴尬,但真正的问题是我的防火墙Comodo Firewall 以某种方式阻止了git 初始化的ssh 连接。

我可以毫无问题地通过 ssh 连接,例如使用命令行或 Putty 但不知何故 Comodo 导致了这个奇怪的问题。

感谢大家的支持!

【讨论】:

    【解决方案7】:

    我认为路径(例如:C:\Program Files (x86)\Git)有空格,因此无法识别。

    解决它

    • 做一个简单的链接来缩短路径

      mklink /d "C:/Git" "C:\Program Files (x86)\Git"

    它适用于我和 Jenkins(如果你将它与 Git 插件一起使用)

    • 设置 GIT_SSH=C:\Git
    • 最后,将PATH设置为%GIT_SSH%\bin

    【讨论】:

    • 无法在我的 Windows 10 系统上运行,因为需要%GIT_SSH% 指向可执行文件。无论如何,问题不在于 git 找不到它,而在于它无法生成它。 拒绝访问,无论我设置什么权限。此外,在最近的发行版中,二进制文件位于%GIT_SSH%\usr\bin
    • 是的。这是因为您试图从 32 位可执行文件生成 64 位可执行文件,而在这种情况下,系统目录是虚拟的。这是一个您通常完全孤立的高级主题,大多数人在第一次遇到它时会感到非常冒犯,但基本上“System32”在这种情况下并没有达到您的预期 - 甚至没有关闭。查找“SysNative”与“System32”,然后试试这个: GIT_SSH='"C:\\Windows\\SysNative\\OpenSSH\\ssh.exe"' 这仅适用于 Windows 10 build 1803 或更高版本(大约2018-2019)。注意两组引号。
    【解决方案8】:

    除非您有一些不明显的防病毒交互,否则看到此错误消息的唯一其他情况(除了您所指的issue 313)是:

    error: cannot spawn git: No such file or directory

    如果您遇到此错误“error: cannot spawn git: No such file or directory”,这是一个非常讨厌的问题。
    我花了一天的时间来追踪它,但归结为如果您在存储库中有超过 500 个标签,它必须破坏一些内部命令行限制。
    TLDR:如果您收到此错误,请删除一堆标签。

    【讨论】:

    • 感谢您的回答,但这些标签是什么?
    • @Patryk 我的意思是让您检查您尝试克隆的 GitHub 存储库中是否已经声明了太多标签:例如,请参阅此存储库的标签:github.com/git/git/tags,以及检查您要克隆的 repo 是否有超过 500 个标签:https://github.com/username/reponame/tags
    • 不,这不是问题,因为我要克隆的 repo 几乎是空的 - 只有一个 README 文件和一个带有代码的文件。
    • @Patryk 好的,如果其他人有这个问题,我会留下答案。
    【解决方案9】:

    对于找到此帖子但收到类似于以下错误消息的任何人(权限被拒绝):

    error: cannot spawn C:\Program Files\OpenSSH\: Permission denied
    fatal: unable to fork
    

    在我的情况下,错误是 GIT_SSH 指向目录 C:\Program Files\OpenSSH\ 而不是文件 C:\Program Files\OpenSSH\ssh.exe 。修复此问题后,git 在 PowerShell 和 bash 中都可以工作。

    【讨论】:

    • 重要提示:请注意,如果您明确尝试使用 Windows 的内部、本机、OpenSSH 功能(自 Windows 10 1803 起可用),这是不正确的。在这种情况下,正确的参考将是:C:\Windows\SysNative\OpenSSH\ssh.exe 此外,如果您尝试将内容与 Visual Studio 2022 集成,则在 %UserProfile%/.gitconfig 中指定它的正确方法, 是严格、准确和 精确 这个:[core] sshcommand = '"C:\\Windows\\SysNative\\OpenSSH\\ssh.exe"' 注意双引号周围的单引号引号和“SysNative”。
    • @breakpoint 由于更新周期长,我想明确地使用另一个 SSH 客户端,而不是 Windows 开箱即用的客户端。使用 GIT_SSH 环境变量也适用于 Visual Studio 2022、Visual Studio Code 和其他 Git 客户端 - 至少在我们公司的机器上。
    • 更新周期长是一个有趣的点。很高兴听到您很幸运地使用环境变量达到了同样的效果,我可能最终不得不自己在一台机器上执行此操作,所以感谢您的跟进。
    • 用@breakpoint 为 sshcommand 指定的值设置 GIT_SSH 对我不起作用
    【解决方案10】:

    在我的 windows 7 默认 ms git bash 安装中,我需要将 GIT_SSH 设置为:

    "C:\\Program Files (x86)\\Git\\bin\\ssh.exe"
    

    所以只需找到 Git 安装提供的 ssh.exe 并使用正确的目录更新上述内容。

    要在每次运行 git bash 时持久化,只需在 .bashrc 文件中添加主目录:

    export GIT_SSH="C:\\Program Files (x86)\\Git\\bin\\ssh.exe"
    

    【讨论】:

      【解决方案11】:

      如果您使用的是 Windows PowerShell,请尝试将正确的路径设置为 GIT_SSH。就我而言:

      PS C:\some\path> $env:GIT_SSH="C:\Program Files\PuTTY\plink.exe"
      

      【讨论】:

        【解决方案12】:

        我经常收到错误

        错误:无法生成“C:\Plink.exe”:没有这样的文件或目录 致命:无法分叉

        在执行git pushgit pull 时。我通过进入 .git/config 文件并更改来解决它

        url = git@github.com:<USER>/<REPO>.git

        url = https://github.com/<USER>/<REPO>

        希望这会有所帮助!

        【讨论】:

          【解决方案13】:

          我也遇到了同样的问题,杀毒软件阻止了 ssh 代理的执行。卸载防病毒软件对我有用。

          【讨论】:

          • 这是@VonC 的现有答案的副本。在回答已有答案的旧问题时,请确保您提供新颖的解决方案或比现有答案更好的解释。请记住首先查看所有现有答案。
          猜你喜欢
          • 2021-04-26
          • 1970-01-01
          • 2019-02-18
          • 2022-01-03
          • 1970-01-01
          • 2016-04-16
          • 1970-01-01
          • 2015-10-21
          相关资源
          最近更新 更多