用 strace 命令浅析 git push 通过 SSH 工作的原理
2016-02-26 10:26
465 查看
昨天,突如其来的好奇充斥着我的脑袋:究竟 git push 如何通过 SSH 工作呢?由于我越来越习惯使用 strace 来折腾这类问题,所以我又尝试用它来练练手。如果我利用 strace(跟踪)git push 命令到这个网站的(资料)库,会得到如下显示:
所以 git push 最终会调用 ssh git@github.com git-receive-pack <repo-path>。然后在我的终端(terminal)尝试输入以下命令,得到了以下线索:
终端依然在等待我的输入。SSH 用来解决身份验证和远程控制的问题,验证成功后,SSH 的另一端会运行一段命令来进行数据交换。而上面这几行就是数据交换的开始。
在网上稍微搜索了一下,我知道了这个协议是由行组成的,而每一行的 4 位前置码正是行长度的十六进制表示。后面跟着提交的 SHA-1 和 ref ,发送端以一行 “0000” 作为结束标识符。
上面的每一行对应(资料)库里的每一个分支:第一行自带了一条长长的小尾巴,好像是发送程序的自我介绍和支持的相关功能。
我在研究这些代码的时候,使用 xsel 命令把输出结果复制到编辑器上面,不过令人困惑的是,我粘贴得到的竟然只有第一行而不是所有元数据。
通过 hexdump –C 查看完整的输出后发现,原来在 refs/heads/gh-pages 后面有一个空字节,而且在末尾处还换行了(用星号 * 标记处):
我在没有仔细研究的情况下,大胆地做了一个猜想:那些在 github 上做开发的家伙们,定义了一个相当简单的长度前缀+换行分隔协议(length-prefixed, newline-separated protocol),当他们有需要向协议里面加入一些元数据的时候,可以保持和老版本
git 的兼容性。这个解决方案巧妙地利用了 C 语言的 0 结尾字符串:把元数据放在空字节和新行之间。用这种方式读取数据(读取到新行之前位置)可以得到所有的元数据。元数据处理代码在执行时会跳过空字节,但是现有的协议代码却只能看到到空字节之前的数据,它们对这种改动完全无感!
所以我之前用 xsel 命令复制数据时,那些空字节后面的东东被完美地忽略了。
真相就只有一个,谜底就这样被解开了!(其实wo真不是柯南哦)
问啊-一键呼叫程序员答题神器,牛人一对一服务,开发者编程必备官方网站:www.wenaaa.com
QQ群290551701 聚集很多互联网精英,技术总监,架构师,项目经理!开源技术研究,欢迎业内人士,大牛及新手有志于从事IT行业人员进入!
在网上稍微搜索了一下,我知道了这个协议是由行组成的,而每一行的 4 位前置码正是行长度的十六进制表示。后面跟着提交的 SHA-1 和 ref ,发送端以一行 “0000” 作为结束标识符。
上面的每一行对应(资料)库里的每一个分支:第一行自带了一条长长的小尾巴,好像是发送程序的自我介绍和支持的相关功能。
我在研究这些代码的时候,使用 xsel 命令把输出结果复制到编辑器上面,不过令人困惑的是,我粘贴得到的竟然只有第一行而不是所有元数据。
git 的兼容性。这个解决方案巧妙地利用了 C 语言的 0 结尾字符串:把元数据放在空字节和新行之间。用这种方式读取数据(读取到新行之前位置)可以得到所有的元数据。元数据处理代码在执行时会跳过空字节,但是现有的协议代码却只能看到到空字节之前的数据,它们对这种改动完全无感!
所以我之前用 xsel 命令复制数据时,那些空字节后面的东东被完美地忽略了。
真相就只有一个,谜底就这样被解开了!(其实wo真不是柯南哦)
问啊-一键呼叫程序员答题神器,牛人一对一服务,开发者编程必备官方网站:www.wenaaa.com
QQ群290551701 聚集很多互联网精英,技术总监,架构师,项目经理!开源技术研究,欢迎业内人士,大牛及新手有志于从事IT行业人员进入!
相关文章推荐
- 成都Uber优步司机奖励政策(2月26日)
- 类和类的静态变量
- 根据字段条件清理mysql数据库数据
- 二维码小工具使用指南
- activity_显示样式
- python系列之 - 面向对象(一)
- [慢查优化]慎用MySQL子查询,尤其是看到DEPENDENT SUBQUERY标记时(转)
- 后台post get请求
- 欢迎使用CSDN-markdown编辑器
- 如何用ping检测代理服务器状态?
- 使用QTextCodec/QString/QByteArray/std::string时中文编码问题
- PDO简单操作
- AnimatedVectorDrawableCompat适配5.0以下安卓
- c++ static的作用,以及static对象在类和函数中区别
- 常量内存
- mysql复制表的操作
- NSIS 学习实例(一)
- 解决div遮挡select的问题
- 北京Uber优步司机奖励政策(2月26日)
- 8.python模块补充