git jump是git中自带的一个鲜为人知的可选功能,那么在今天的功能介绍中,我们首先来介绍git jump。git jump打包了其他git命令,例如git grep并将其的结果呈现一个quickfix列表。比如用git jump grep git就可以在vim展现项目中所有匹配git的列表导航。
除了grep,jump也可以用于diff和merge命令。在diff情况下时会展示仓库中各个更改块的开头,可以快速查看所做的变更。而git jump merge, 则会在vim中打开合并冲突列表。
在Git 2.40 中, git jump除了Vim,现在也可以设置为Emacs,这样可以使用git jump将位置列表呈现在Emacs中。对于Emacs用户,这是一个福音,要设置为Emacs可以通过:
M-x grepgit jump --stdout grep git
cat-file
如果写过git库相关信息的脚本,你可能会熟悉git的cat-file工具,用来可用于给出仓库中任意块对象的内容。如果你不在意这个块的内容,而只是想知道他占用的空间,则可能需要
--batch-check=%(objectsize),或者-s。
但是在早先的版本中--batch-check和 -s选项 git cat-file和--use-mailmap,当邮件映射重写两侧的名称/电子邮件对长度不同时,可能会导致不正确的结果。 在2.40版本中,该问题已得到纠正,并且git cat-file -s和--batch-checkwith 可以用来计算块对象大小。
check-attr
这可能是另一个鲜为人知的git命令。check-attr用于确定哪个gitattributes为给定路径设置。
这些属性由一个或多个定义和设置.gitattributes存储库中的文件。对于简单的示例,很容易从 .gitattributes文件,像这样:
head -n 2 .gitattributes
* whitespace=!indent,trail,space
*.[ch] whitespace=indent,trail,space diff=cpp
在这里,很容易看出任何以*.c或者*.h将具有上面设置的属性。但是当有更复杂的规则在起作用,或者项目使用多个时会发生什么? .gitattributes文件? 对于这些任务,可以使用 check-attr:
git check-attr -a git.c
git.c: diff: cpp
git.c: whitespace: indent,trail,space
在过去版本中,一个关键的限制是check-attr的使用需要一个索引 ,这样如果想在无本地文件的裸存储中使用check-attr,则需要建立临时读取索引,如下所示:
TEMP_INDEX="$(mktemp ...)"
git read-tree --index-output="$TEMP_INDEX" HEAD
GIT_INDEX_FILE="$TEMP_INDEX" git check-attr ...
在Git 2.40中,check-attr支持新的--source=扫描.gitattributesin,这样上述操作,只需:
git check-attr -a --source=HEAD^ git.c
git.c: diff: cpp
git.c: whitespace: indent,trail,space
用c重写的bisect
多年来,开发社区一直在努力将Git中的一些Perl或Shell实现的功能用C来重写。除了能够在本地使用Git自己的API之外,将Git命令整合到一个进程中意味着它们能够在进程启动成本高的平台(例如 Windows)上更快地运行。
在2.40版本中有几个命令已经完全用c重写:
其中一个就是git bisect现在作为本机内置函数在C中完全实现。
其他更新
另外其他一些需要值得提及的还有一些。比如git CI基础设施有一些底层改进。 Git有一些长期运行的特定于Windows的CI构建已在新版本中禁用(git-for-windows)。 直接带来的后果就是可以提高CI运行的效率,并且每次推送的资源也更少。
领取专属 10元无门槛券
私享最新 技术干货