如何使用 ssh 从本地 git 存储库克隆?

如何使用 ssh 从本地 git 存储库克隆?

最终目标是在我的电脑上托管一个支持推送和拉取的远程仓库。

从官方文档给出的来看git help clone,主机url格式应该是

git clone ssh://user@localhost:/C:/path/to/repo

或者

git clone git://localhost:/C:/path/to/repo

Git clone ssh 返回

fatal: ''/C:/path/to/repo'' does not appear to be a git repository

当 git clone git 返回时

fatal: unable to connect to localhost:
localhost[0: ::1]: errno=Unknown error
localhost[1: 127.0.0.1]: errno=Unknown error

该 repo 是没有 --bare 标志的默认 repo,但我认为这不会影响克隆而是推送到 master,对吗?

该仓库有现有的提交

我尝试过 localhost/C/ (不带 :) 和 path/to/repo.git,但没有成功

我看过一些指南建议使用 git@localhost,但这没有任何意义,我想他们忘了提到它是用于 github 和 gitlab 之类的,所以我没有太注意这一点

对于我的 ssh 设置,我有一个 ed25519 和 rsa 4096 位密钥对,其中私钥注册到我的身份,ssh-add公钥复制到 ~/.ssh/ 下的 authorized_keys (并重新启动)sshd

ssh user@localhost将会按照预期进入 ssh shell

sshd_config 文件没有太多修改,但为了排除故障,我将其重置为 sshd_config_default

权限也很好,使用 windows openssh 包附带的权限修复脚本进行了检查

路径已正确配置为自定义 openssh ssh 文件,而不是窗口文件

使用公钥认证从 github 克隆工作正常,所以我认为是主机端的问题

并且 GIT_SSH=/path/to/ssh.exe,GIT_SSH_COMMAND=ssh

哦,scp 在目录上运行得很好

我可能遗漏了文档中的某些内容,在使用 ssh clone 之前还需要配置什么吗?谢谢

Windows 11 Pro 23H2 OpenSSH_for_Windows_9.5p1,LibreSSL 3.8.2 git 版本 2.45.0.windows.1

答案1

首先,您在这里混合了两种不同的地址格式。Git 支持 URL 格式的地址和 rsh/rcp 格式的地址,但您尝试使用的内容混合了这两种格式的功能。

  • rcp 格式的地址(或 scp 格式;rcp 是 SSH 的 scp 的前身)使用冒号:作为主机和路径之间的分隔符,并且它们没有“URL 方案”前缀:

    user@host:path
    user@host:/path
    
  • URL 格式的地址总是使用斜杠/分隔的组件,就像 http:// 一样,并且中间没有中间字符:(除非指定端口号)。

    ssh://user@host/path
    git://host/path
    git://host:port/path
    http://user@host/path
    

因此您需要使用ssh://user@localhost/C:/foouser@localhost:C:/foo。(不是git://- 这是用于只读,明文“git-daemon”连接。)

除此之外,真正的问题在于服务器配置。Git 通过 SSH 工作,通过调用“git-upload-pack <path>”作为远程命令(以便它可以通过 SSH 与 Git 协议通信),但它通过使用 sh/bash 语法使用'单引号引用存储库路径来实现这一点'。例如,它发送:

git-upload-pack 'C:/path/to/repo'

服务器端的 Cmd.exe shell 无法理解它(Windows 版 Git 本身也没有对其进行任何特殊处理),因此 git-upload-pack 认为存储库路径实际上是'C:/path/to/repo'包含单引号的。

解决此问题的一个方法(我在 Windows XP 上用过)是在服务器上创建一个自定义包装器脚本,该脚本将被调用而不是真正的 git-upload-pack.exe,并负责取消引用(通过手动字符串操作或通过调用实际sh)。在旧 PC 的备份中,我有:

C:\Users\xxxxx\git-upload-pack.cmd
@"C:\Program Files\Git\bin\sh" -c "'/c/Program Files/Git/bin/git' 上传包 %*"

将 .cmd 批处理脚本放在 Cmd 可以找到的任何命令位置 - 例如,在C:\Windows用户的主目录中,或者在列出的任何自定义位置PATH- 这样它就可以被找到“C:\Program Files\Git\cmd”中的 .exe。

重复此操作以git-receive-pack使“git push”工作。


(除此之外,如果你使用 URI 语法(ssh://,而不是 rcp 语法),那么它还包括一个前导斜杠/作为路径的一部分,例如/C:/test.git,但幸运的是由于它是基于 MinGW 的程序,因此 Windows 版 Git 能够理解它,所以这不会成为问题。)

相关内容