为Ruby、Python、Elixir、Go等提供更好的Git diff输出

2020-10-20 01:43:12

你们中的老Git用户将会熟悉diff输出,它被分解成“块”,如下所示:

@@-24,7+24,7@@class TicketPdf ApplicationController.Render(";Tickets/index.html.haml";,Layout:";Tickets";,-Assigns:{Tickets:Tickets}+Assigns:{Tickets:Tickets,Event_Name:Event_Name})结束。

第一行(从@@开始)称为块标题,它用于帮助确定更改的方向。它为我们提供了更改的行号(@@..@@之间的数字),但也给出了发生更改的封闭上下文的文本描述,在本例中为类TicketPdf";。Git试图找出这个封闭的上下文,不管它是函数、模块还是类定义。对于类似C的语言,它在这方面做得相当好。但是对于上面的Ruby示例,它没有向我们显示直接的上下文,该上下文实际上是一个名为Tickets_as_html的方法。这是因为Git开箱即用不能识别方法定义的Ruby语法,即def ticket_as_html。

@@-24,7+24,7@@def Tickets_as_html ApplicationController.Render(";Tickets/index.html.haml";,Layout:";Tickets";,-Assigns:{Tickets:Tickets}+Assigns:{Tickets:Tickets,event_name:event_name})结束。

而且,Git努力找出正确的封闭上下文的不仅仅是Ruby。当涉及到块标题上下文时,许多其他编程语言和文件格式也会有不足之处。

值得庆幸的是,不仅可以配置特定于您的语言的自定义正则表达式来帮助Git更好地调整自身的方向,而且在Git中甚至可以为许多语言和格式预定义一组模式。我们所要做的就是告诉Git我们的文件扩展名要使用哪些模式。

我们可以通过在repo中定义一个.gittributes文件来实现这一点,该文件将Ruby文件扩展名映射到Ruby的diff模式:

一些开放源码项目定义了它们自己的.gittributes文件。有一个在铁轨上。在Git源代码中甚至有一个支持Perl和Python的不同模式。

我们可以配置一个全局.gittributes文件,而不是将.gittributes文件添加到每个存储库。只需在您的主目录中创建一个.gittributes文件,使用您感兴趣的所有文件格式填充该文件,然后将Git指向该文件:

我已经将一个示例.gittributes文件与一些常见的文件格式组合在一起,以帮助您入门。

我不知道为什么Git没有默认配置这些文件格式模式。多亏了汤姆,他恼火的推文让我注意到了这个不太明显的特点。

作者:Tekin Sületman发行人