使用git Bash在windows上搭建 Git 服务器
在 windows 上安装 git,都会附带 git bash.
git bash 相关路径
git bash 是基于 msys2 的,在 windows 上任务管理器里可以看到:
git bash 的根目录
msys2 本身用来在 windows 上模拟 Linux 类环境。git bash 的根目录的实际物理目录是 git 的安装目录,在我的 windows 上,是
|
|
可以在 git bash 里切换到根目录 cd /
,然后在当前目录创建个文件来确证。
git bash 的用户目录
git bash 的用户目录和 windows 的用户目录保持一致,在系统盘 User 下。在我的 windows 上,用户目录是这个cd ~
:
|
|
同时看到,git bash 里访问 windows 的磁盘 X 下的文件的方式为 /X/file
ssh 服务
ssh 服务需要 sshd 服务器,ssh 客户端来共同完成。一般安装 ssh 服务都会同时安装这两个程序,在 windows 上,分别是ssh.exe 和 sshd.exe.
尝试在 git bash 下启动 ssh 服务。
直接启动 sshd
,报错:
sshd re-exec requires execution with an absolute path
提示需要使用绝对路径。使用 which sshd
获取绝对路径,使用最对路径启动,报错
sshd: no hostkeys available – exiting.
提示没有 key 文件,需要使用 key文件来对外标识自己的身份。
|
|
使用上边命令生成多个加密方式的 key 文件,提示
ssh-keygen: generating new host keys: RSA DSA ECDSA ED25519
此命令会在 /etc/ssh
目录下,生成 8 个文件。
之后便能正常启动 sshd
。多次启动 sshd,还会生成 /etc/ssh/sshd.pid
文件,确保只有一个 sshd
进程实例。
密码登陆
ssh 服务有 ~/.ssh/config
、/etc/ssh/ssh_config
和 /etc/sshsshd_config
两个配置文件,前两个是客户端配置,最后一个是服务器的配置。
修改服务器 sshd_config 配置,允许密码登陆。
|
|
重启 sshd 服务。
由于没有 Linux 上的 service 命令来管理 sshd 服务,不过 git bash 一样可以通过 ps 来查看启动的进程,同样适用 kill 来停止。
正常情况下,便可以使用 ssh 登陆 windows。注意登陆的用户名。默认 gitbash 的用户应该可 windows 的用户一致,如果使用 windows 上是用管理员登陆的,那么用 administrator 登陆即可。
在 gitbash 里使用 id
可查看当前的用户。
uid=197108(Administrator) gid=197121 groups=197121
在另外一台 Linux 服务器上,可以通过 ssh 客户端登录 windows。
git 服务器
将 A 机器上 windows 本地的 git 仓库作为 B 机器上某个仓库的远端仓库,进行拉取和推送。
在 A 机器上启动 sshd 服务器,默认使用 22 号端口。
A 机器如果在内网,如果想办法从外网能够访问。我这里使用 ssh 端口转发来做。关于 ssh 端口转发,见之前我的一片博客.
将 B 机器本地的 6666 端口转发到 A 机器的 22 号端口上。
在 B 机器上为本地的 git 仓库添加远端仓库。
|
|
ssh 指定 git 使用的协议。git 一共支持 LOCAL 本地文件系统协议、HTTP 协议、SSH 协议、GIT 协议这 4 种协议。
administrator 指定用户名。
127.0.0.1:6666 指定了通信地址。
/D/project/code_project 指定了远端仓库所在的位置 (即仓库在 A 机器上的位置,这里需要使用 git bash 里识别的位置)。
同 Linux 上的一样,密码可以通过 passwd 来指定和修改。
正常情况下,就能正常的进行 pull 和 push 操作了。
使用密码登陆,这样每次 push 和 pull 时,还需要输入密码,可以更换为 ssh key,省掉密码。
git 仓库免密
使用 ssh-key
制作没有密码的 key(key 可以本身是可以带有密码的,ssh-keygen -A 一路 enter 就没有密码)。
跟在 Linux 上一样,在 A 机器上的用户目录下创建 ~/.ssh/authorized_keys 文件,里边复制进去公钥的内容。
完毕之后,重启 A 上的 sshd 服务。
B 机器上我有多个 key,在 git 操作的时候没有可以指定 key 参数的选项(也许有我不知道的方法?),所以需要在客户端使用的 config 文件,指定特定的服务器使用特定的 key 文件。
在用户目录下的 config 文件 ~/.ssh/config
添加一下内容,指定 ssh 服务器地址 127.0.0.1:6666 使用的 key 文件,同时定义一个别名。
Host workrep HostName 127.0.0.1 User administrator Port 6666 IdentityFile “D:\project\code_project\keys\king_nopass”
在 B 机器上修改远端仓库的地址,使用上边定义的别名:
|
|
在 B 机器上,往 A 上推送。