今天终于发现,之前对 git+ssh 协议的认知是错误的

93 天前
 julyclyde

我一直很好奇,为啥 dumb HTTP 协议需要挂一个 post update hook 去执行 update-server-info 命令,而 git+ssh 协议却不需要

后来才明白,我之前误把 git+ssh 理解为 file+ssh 协议了

今天使用 export GIT_SSH_COMMAND="ssh -vvv" 的方法,给 ssh 开了 verbose 模式 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-server-info 这个步骤,需要通过 hook 来执行该命令。

不过 post update hook 和 git send-pack 之间的互动我没看明白,不知道 update-server-info 命令到底输出了什么内容给 git send-pack 命令,让它上传文件到 dumb HTTP 服务去 这段代码应该怎么读呢?

2178 次点击
所在节点    git
1 条回复
nanmu42
93 天前

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1065857

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX