原文链接: What’s new in Git 2.1
Git 2.1新特性
git 2.0.0发布2个半月后,2.1.0作为小版本更新,带来了一大波令人兴奋的新特性。
完整的发布说明文档可以在这里查看,
如果你对git社区接触不多,会觉得发布说明文档说明有些太简明了。
这篇文章是我对这次发布中觉得令人兴奋的方面所做的评注。
更好的分页程序缺省设置
本文引文都是直接提取自发布说明文档,会在其中加上自己的评注。
自从很早期的
Git开始,当调用less分页程序时,LESS环境变量缺省值成FRSX。S选项(截断长文本行而不是折行)从缺省值中删除了,因为对不同的人有不同的说法,这个选项或多或少是个人口味问题。 (比如,R选项就合理得多,因为很多不同的输出都是彩色的,而FX也是合理的,因为输出常常短于一页。)
如果你没有覆盖过git分页程序的缺省值,这个变化意味着git命令的分页输出会在终端宽度的地方折行而不是截断行。
下面是git 2.1.0(折行)和git 2.0.3(截断)在右侧的显示的例子:
这个只会影响你日志的输出,如果你用的是一个窄的终端,或者在提交消息中有长行。
一般git推荐提交日志信息不要超过72字符宽度,
但如果觉得折行很烦,可以通过恢复原来的行为来关闭:
$ git config core.pager "less -S"
当然,分页程序也会用于其它的输出,比如git blame,这种情况下由于作者名长度和代风格,可以能会有很长的行。
2.1.0的发布说明文档也指出了可以只在blame的分页程序中启用-S选项:
$ git config pager.blame "less -S"
如果你对git还在使用的缺省less选项很好奇,说明如下:
-F:让less进程退出,如果输出少于一页。-R:保证只有ANSI颜色转义序列按原始形式输出,这样git控制台颜色才能生效。-X:避免屏幕在less启动时被清空。这个也是在less输出少于一页时才是有用的。
更好的Bash补全
更新了
Bash的补全脚本(在contrib/),对于定义了复杂命令序列的别名能更好的处理。
这个超酷!我是一个自定义git别名的大粉丝。能够在复杂的别名上用上git的Bash自动补全,
让这些别名在命令行上使用起来更强大和方便。举个例子,我定义一个可以从日志中grep出JIRA风格的issue主键(如STASH-123)的别名:
issues = !sh -c 'git log --oneline $@ | egrep -o [A-Z]+-[0-9]+ | sort | uniq' -
所有的命令行参数传给git log命令,这样可以限制提交的范围用于返回issue主键。
比如,git issues -n 1只会显示我的分支最近一次提交所关联的issue主键。
在2.1.0中,git的Bash补全让我就像git log命令一样去补全git的issue别名。
在git 2.0.3下,键入git issues m<tab>会退化成缺省的Bash补全行为,列出当前目录下m开头的文件。
在git 2.1.0下,正确地补全成master,就和git log命令下补全动作一样。
通过在别名加上空命令前缀:前缀,就可以触发Bash的补全。
如果要补全的不是别名中的第一个命令,这个很有用。举个例子:
issues = "!f() { echo 'Printing issue keys'; git log --oneline $@ | egrep -o [A-Z]+-[0-9]+ | sort | uniq; }; f"
这个别名不能正常补全,因为git不能把echo命令识别为补全目标。
但如果加上前缀成: git log;,补全就正确了:
issues = "!f() { : git log ; echo 'Printing issue keys'; git log --oneline $@ | egrep -o [A-Z]+-[0-9]+ | sort | uniq; }; f"
这是个可用性巨大改进,如你喜欢编写复杂的别名脚本!
请记住,补全功能的脚本在contrib/目录下,不是git核心的一部分,
所以如果你要使用这个功能,不要忘了更新Bash profile指向新版本的contrib/completion/git-completion.bash。
git commit命令使用大概时间(approxidate)
git commit ‐‐date=<date>选项有了更多的时间戳格式选项,包括--date=now。
当严格的parse_date()函数不能解析给的日期字符串时,
git提交的--date选项现在会回退到git酷炫的(也有些怪异的)approxidate(大概时间)解析器。
approxidate可以处理显而易见的值,像--date=now,也允许一些略复杂格式,像--date="midnight the 12th of october, anno domini 1979"或是--date=teatime。
如果你想了解更多,Alex Peattie有一篇优秀的关于git酷炫的日期处理的博文。
更好的路径显示方式grep.fullname
git grep会读取grep.fullname配置变量,强制‐‐full-name成为缺省。 这可能会让使用脚本的用户出错,这些用户不期望这样的新行为。
省得你去翻git-grep的man,下面是--full-name选项的文档说明:
--full-name
当从子目录运行时,命令输出的路径通常相对于当前目录。这个选项强制输出的路径是相对项目的顶级目录。
非常贴心!这个缺省行为非常符合我的工作方式,我常常会运行git grep找出一个文件的路径,
拷贝粘贴到一个XML文件中(我这么做出卖了其实我是个Java开发)。
如果你也觉得有用,只要简单运行:
$ git config --global grep.fullname true
在你的配置文件开启这个选项。
--global选项把选项应用到$HOME/.gitconfig文件中,这样选项值就会我系统上所有git仓库的缺省行为。
如果有必要,你可以也只在仓库级别覆盖配置值。
等等,还有更多
在git 2.1.0中还有其它很好的内容我没有在一篇文章中涉及到,所以有兴趣可以看看完整的发布说明文档。
由衷地感谢git团队又提供了一个高质量和丰富新功能的版本。
如果你有兴趣了解更多有关于git的实用小建议和花边新闻,
欢迎在Twitter上关注我(@kannonboy)和Atlassian开发工具(@atldevtools)。
