Files
translations/whats-new-git-2-1
2014-09-05 22:14:59 +08:00
..
2014-09-05 22:14:59 +08:00

原文链接: Whats new in Git 2.1

Git 2.1新特性

git 2.0.0发布2个半月后2.1.0作为小版本更新,带来了一大波令人兴奋的新特性。

完整的发布说明文档可以在这里查看 如果你对git社区接触不多,会觉得发布说明文档说明有些太简明了。 这篇文章是我对这次发布中觉得令人兴奋的方面所做的评注。

更好的分页程序缺省设置

本文引文都是直接提取自发布说明文档,会在其中加上自己的评注。

自从很早期的Git开始,当调用less分页程序时,LESS环境变量缺省值成FRSXS选项(截断长文本行而不是折行)从缺省值中删除了,因为对不同的人有不同的说法,这个选项或多或少是个人口味问题。 (比如,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别名的大粉丝。能够在复杂的别名上用上gitBash自动补全, 让这些别名在命令行上使用起来更强大和方便。举个例子,我定义一个可以从日志中grepJIRA风格的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中,gitBash补全让我就像git log命令一样去补全gitissue别名。

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-grepman,下面是--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)。