最终目标是在我的电脑上托管一个支持推送和拉取的远程仓库。
从官方文档给出的来看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:/foo
或user@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 能够理解它,所以这不会成为问题。)