{singhi}
在 Windows 机器上搭建 GIT 中心,并借 SSH 传输资源

前些日子,在做一个关于植物的本地网站。网站的静态资源、图片服务和 WWW 服务都部署在一个低端的 windows 笔记本上。笔记本性能非常糟糕,打开 VSCode 都比较的卡顿。因此,比较好的方式是,在 mac 上开发,然后,将代码上传到 windows 上,服务自动重启。

我想到用 GIT 的代码管理能力,以及 SSH 的传输能力,来达到我的目标。

我的设想是这样的,在 windows 上安装一个 GIT 中心仓库,它托管了全部代码和资源,然后 mac 通过 git clone 将仓库复制下来。开发阶段性完成后,git push 到 windows GIT 仓库中心。nodemon 检测到代码的更新,重启服务。

这里有一点不便,即每次都要 git push,但这似乎无法避免!

然而,除此之外,有一个更不妙的地方。GIT 要求中心仓库必须 bare,bare 仓库不存在工作区,只有索引区。关于 bare,可以查看这篇文章。因此,需要在 windows 上另外再 clone 一份代码,以其作为网站的资源目录。

cd ~
mkdir ./plants
cd ./plants
git init --bare 

好了,现在我有了中心仓库。接下来,我需要在 mac 上 clone 它。

git clone ???

事情往往不如你想象的那么简单,这时问题出现了:

git clone 的路径该怎么写呢?

根据官方的文档,我可以选择 ssh 协议来 clone。那么命令可能是:

git clone ssh://user@192.168.10.243??

需要在 windows 上安装 SSH 服务了。在 windows10 上安装 SSH 服务是比较方便的,windows10 已经预设了该功能,只需要你点点鼠标就能安装。具体的操作是:

设置 > 应用 > 应用和功能 > 可选功能 > 添加可选功能 > 点击“OpenSSH Server”

等服务安装好,在 win10 的万能搜索框中输入“services.msc”打开服务管理器。找到 OpenSSH Server,设置为自行启动。

在 mac 上测试链接:

ssh user@192.168.10.243

user 默认使用 windows 系统本地账户,此时需要你输入相应的密码。

OK,现在我们有了 ssh 和 git,回到上边的问题:如何写 git 中心仓库的地址?

git clone ssh://user@192.168.10.243 ??? // 后边是什么呢?

这个“小问题”困扰了我一个下午,不管你信或不信。我尝试了各种拼写方式,搜索了 google、bing,甚至忍辱动用了百度 😂。

比如:

git clone ssh://user@192.168.10.243/~/plants

使用了 ~,因为我在 windows 上使用的是 bash 终端。~ 表示了当前用户的 home 目录。Mac 上,这个命令返回了错误提示:

'git-upload-pack' ?????ڲ????ⲿ???Ҳ???ǿ????еij???
?????????ļ???
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

这样一段乱码对于我探寻问题的究竟,制造了莫大的困难!开始,我试图先解决这个乱码的问题,设置了终端的编码,什么 utf8、gb2312、gbk 等等,无所获;也在各大搜索引擎输入“git ssh 乱码”等关键词,均无果。

总之 clone 不成!

我回到 windows 电脑,做了另一件事。我用 bash 终端,将中心仓库 clone 到另一个目录:

git clone ~/pants plants_run

这是成功的,后续的 pull 或 push 都没什么问题。

我使用 ssh user@localhost 登录到系统,进入 ~/plants_run 目录,执行了 git pullgit push,也没什么问题。

索性搜索一下 git-upload-packCould not read from remote repository,得到了一些相似问题的分析,其中书声的博客所写的Git 克隆远程仓库提示…与我当前的问题十分相近,也许乱码的部分就是“未找到命令”。

按照这个思路,我猜测 git-upload-pack 是一个命令,在我们需要远程下载仓库的时候用到了它。那么,它在什么地方呢?是谁使用了它?客户端还是服务端?

还是在 bash 终端,我敲下了 where git-upload-pack 发现它是存在的:

C:\Program Files\Git\mingw64\bin\git-upload-pack.exe

如此,事实与猜测不符了 😢

无奈之下,我又逐行阅读了 cnblogs 上的一篇文章。这篇文章指导我安装了 OpenSSH Server。

当读到“连接成功后默认的 shell 是 Windows Command shell (cmd.exe) 程序:”的时候,我似乎有了主意。

难道,当我在 mac 上使用 git clone ssh://... 的时候,服务端启动了 windows 上的 cmd 来提供命令执行环境?

的确如此!

切换到 windows,打开 cmd,输入 git-upload-pack,系统果然提示“git-upload-pack 不是内部或外部命令,也不是可运行的程序或批处理文件”。

设置环境变量!

找到 git-upload-pack 所在的 bin 目录,将其路径添加到系统环境变量中。

再来在 mac 上试一下命令 git clone ssh://user@192.168.10.243/~/plants,以为这下没问题了,结果😭:

fatal: ''~/plants'' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

这下是仓库的路径写得不对!(1)

那么,应该怎么写呢?

既然,OpenSSH Server 启动 cmd 作为执行环境,那么这个路径的书写应该遵循 cmd 的规则。cmd 是不认识 ~ 的,写绝对路径吧?

git clone ssh://user@192.168.10.243/C://.../plants

路径还是不对!(2)再试:

git clone ssh://user@192.168.10.243/%HOME%/plants
# OR
git clone ssh://user@192.168.10.243%HOME%/plants

不对!(3)参照GIT 官方网站 再试:

git clone ssh://user@192.168.10.243/~user/plants

还是不对!(4)Google、Bing、甚至 Baidu 也都用尽了,没能探寻出答案。

远不止 4 次尝试,因为我记得自己消耗在这上的时间是以小时计的。

但是这不应该是个大问题,一个路径而已嘛,到底该怎么写?竟然找不到任何正统的说明,左一嘴唇右一舌头,没一个能解决我的问题,真气死我也😠

换终端!不用这个 cmd 了,太多的毛病,早些年还很喜欢的。

要换终端,需要写注册表,注册表的路径在:

计算机/HKEY_LOCAL_MACHINE/SOFTWARE/OpenSSH

在万能搜索框输入“regedit”打开注册表编辑器,进入以上目录,添加一个项目,类型为“字符串”,键名为“DefaultShell”,值为 bash.exe 所在的路径(自己去找一下)。

重启 SSH 服务,即大功告成!

终于可以工作了,GIT 的中心和 WWW 目录都在 windows 上,Mac 上主要编码,每次阶段性编码完成,执行:

git add .
git commit -m "..."
git push

然后到 windows 上的 WWW 目录,执行:

git pull

看上起非常麻烦😂

还有一件事可以简化流程,就是使用 SSH 的 publicKEY 做登录验证,避免重复地输入密码。

客户端使用 ssh-keygen 脚手架生成私钥和公钥。将公钥复制到服务端(这里就是我的那台 windows 电脑)的 authorized_keys 文件中,换行间隔多个 key。

那有人可能会问 authorized_keys 在哪啊?默认在 ~/.ssh/ 目录下,如果没有,你自己新建一个吧。

再来执行 git 操作,你会发现没啥 GP 效果。这是因为还有事情没做,你需要打开 /c/ProgramData/ssh/sshd_config(bash)编辑一下:

## ...
PubkeyAuthentication yes # 这行请去掉注释
## ...
AuthorizedKeysFile .ssh/authorized_keys # 这行也去掉注释
## ...
## 以下**十分重要**,务必注释以下两行(默认是开启的),不要相信官方的说明,我已经试了 N 次,均失败
# Match Group administrators
#  AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

谢谢关注!2020 年大吉大利!