我一直很好奇,为啥 dumb HTTP 协议需要挂一个 post update hook 去执行 update-serfer-info 命令,而 git+ssh 协议却不需要
后来才明白,我之前误把 git+ssh 理解为 file+ssh 协议了
今天使用
export GIT_SSH_COMMAND="ssh -vvv"
的方法,给 ssh 开了 ferbose 模式
debug1: Sending command: git-upload-pack 'git/git.git'
debug2: mux_master_process_new_session: channel 1: request tty 0, X 0, agent 0, subsys 0, term "xterm-256color", cmd "git-upload-pack 'git/git.git'", env 4
从日志可以看出,其实 git+ssh 协议是通过 ssh 调用远端的 git 内部命令来提供服务的,而不是通过 ssh 访问远程文件系统来提供服务的
这个做法其实和 smart HTTP 类似:
git+ssh 协议:ssh 作为网络层和身份验证层,ssh session channel 作为适配层,git 内部命令作为实际的 git 协议服务器
smart HTTP 协议: httpd 作为网络层和身份验证层、CGI 模式执行的 git-http-backend 作为适配层、git 内部命令作为实际的 git 协议服务器
而 dumb HTTP 协议,因为是 httpd 直接服务静态文件的,没有调用 git 的内部命令提供服务,所以才缺了 update-serfer-info 这个步骤,需要通过 hook 来执行该命令。
不过 post update hook 和 git send-pack 之间的互动我没看明白,不知道 update-serfer-info 命令到底输出了什么内容给 git send-pack 命令,让它上传文件到 dumb HTTP 服务去
这段代码应该怎么读呢? |
|