开源项目Git发布了2.10.0版本,70多位开发者贡献了代码,加入了一些新特性,修复了bug。下面就来看一下有趣的新特性吧。
push的进度报告
当你运行git push
时,你可能会看见一个进程报告,告诉你发送了多少对象,剩余多少对象,以及数据发送的速度。但是所有的数据发送到服务器之后呢?push完成了吗?
并没有。push大部分工作都在上传数据时完成,但有一部分是CPU密集的工作,必须等到所有对象发送完成之后才能开始。在这部分工作的时候,Git并没有反馈。大多数的push都很小,所以这部分工作可以在瞬间完成,你不会注意到。但当push的对象很多时,这项工作花费的时间就比较多了,甚至会达到几分钟之久,让人干等着。
更糟糕的是,因为这部分时间网络通讯是空闲的,所以有被HTTP代理或其他网络设施丢弃的风险。
Git 2.10加入了对进度报告的接收,可以让你实时关注进度,保持网络非空闲。
当然,我们并不总是需要这些进度信息,有时我们不使用终端push(或者加了 --quit
)参数时,Git 2.10也会不断地发送一个“保持唤醒”的包来保持网络非空闲。
进度报告和保持唤醒的功能都是在服务端实现的,而且对所有版本的Git保持了向后兼容,所以你不必升级就能使用这项功能(但是你的host需要升级)。
此外,还有很多和进度相关的特性。例如,git clone
的时候,检查所有需要接收的对象时可以看到明确的进度。一些进度信息也更加明确,比如远程仓库的auto-gc。
签名验证的优化
Git使用GPG签名的标签和commit很长时间了,但是用起来一直很不方便。Git 2.10在这方面持续做了一些优化。其中一些是运行逻辑的优化,用户不可见。另外增加了一些配置选项,比如log.showSignature
,来为git log
的每一项验证签名。
签名验证的输出格式也发生了改变,显示64位的ids,即使使用旧版本的GPG密钥也会显示(新版本默认使用64位的ids)。这主要是为了回应Evil 32项目这个项目显示了使用32位ids是多么容易冲突。这个项目已经两年了,但是最近有人将日期集的假钥上传到了服务器上,又引起了新的重视。
如果你没有为你的commit和标签签名,这里有几个教程可以参考。
更多颜色属性
你可能已经知道,Git可以在终端输出不同的颜色。但是你知道这些颜色是可以配置的吗?你知道你可以在自定义的log格式和提示中使用它们吗?有些人把它们做得非常漂亮。
Git 2.10加入了新的选项:颜色配置代码现在可以识别斜体和删除线了。
另外,%C(auto)
填充位现在已经得到修复(设计自定义的log
输出非常实用),颜色特性完美支持FreeBSD,HEAD
默认的颜色更加醒目。
其他零碎的东西
- 一般来说,你不需要对HTTP连接Debug,不过以防用得到,Git 2.10加入了
GIT_TRACE_CURL
环境变量。它取代了旧的GIT_CURL_VERBOSE
变量,列出更多细节,支持将输出重定向到文件(避免和其他Git输出的信息乱成一团),更重要的是,可以自动从结果中取消你的授权信息,让分享给别人输出信息更加安全。[资源] - 智能HTTP协议的询问窗口更加频繁,这样通过HTTP fetch一个较大仓库的双向数据更少。[资源]
submodule update
和clone --recursive
可以对每一个子模块的克隆失败重试。[资源]- 帮助页(man页)现在可以将一些强调词语用粗体显示。资源
- Git内部的时间格式代码,现在可以正确显示到2100年,还有84年可以用。资源
- 类似的,
git archive
现在可以通过POSIX扩展产生tar文件,来处理超过8GB的文件,时间戳可以用到2242年以后(8G秒)。资源
以上只是changes的一个抽样,Git 2.10包括600多次commits,在完整的release note可以查看完整列表。