跳到内容

Git 2.29亮点

开源Git项目刚刚发布了Git 2.29,包含来自89多位贡献者的特性和错误修复,其中24位是新贡献者。上次我们见到你时,Git 2.28刚刚…

Git 2.29亮点
作者

开源Git项目刚刚发布Git 2.29有超过89个贡献者提供的功能和错误修复,其中24个是新的。上次我们赶上了和你一起,Git 2.28刚刚发布。在一个版本之后,让我们来看看自那以后发生的最有趣的功能和变化。

实验性SHA-256支持

Git 2.29包括对使用SHA-256散列内容而不是使用SHA-1编写存储库对象的实验支持。

这一切意味着什么?为了解释,让我们从头开始。

将文件添加到存储库时,Git会将其内容复制到斑点对象,并创建引用blob的对象。同样,当你跑步时git提交,这将创建一个犯罪对象,该对象引用表示已提交状态的树。这些对象如何相互“引用”,以及在与Git交互时如何识别它们?答案是,每个对象都有一个唯一的名称,称为其对象id,基于其内容的散列。Git使用SHA-1作为其哈希算法的选择,并取决于不同对象的对象ID是否唯一。

返回这篇博客文章,我们估计,即使你有500万程序员每秒编写一次提交,在太阳吞噬地球之前,你也只有50%的机会意外发生碰撞。 一些 出版 攻击它们使用的技巧可以利用SHA-1中的弱点,从而减少生成冲突所需的工作量,但这些攻击仍需要花费数万美元来执行,并且尚未发布针对Git的已知示例。

正如我们在之前的博客文章中所述,Git(以及使用它的提供者,如GitHub)检查它散列的每个对象,以查看是否有证据表明该对象是冲突对的一部分。这可以防止GitHub同时接受这两个对的良性和恶意部分,因为Git可以检测并拒绝在任何合理的时间内生成冲突所需的数学技巧。

即便如此,加密散列中的任何弱点都是一个坏迹象。即使Git已经实现了检测,阻止了已知攻击的执行,也无法保证将来不会发现和使用新的攻击。因此,Git项目一直在准备一个过渡计划,以开始使用一种新的对象格式,并且没有已知的攻击:SHA-256。

在Git 2.29中,您可以自己尝试启用SHA-256的存储库:

$git—版本
git版本2.29.0$git init--对象格式=sha256 repo
已在/home/ttaylorr/repo/.Git中初始化空Git存储库/$光盘回购$回声 '你好,SHA-256!' >自述.md$git添加README.md$git提交-m"README.md:初始提交"
[master(root-commit)6e92961]README.md:初始提交
1个文件已更改,1个插入(+)
创建模式100644 README.md$git反向水头
6e929619da9d82c78dd854dfe237c61cbad9e95148c1849b1f96ada5ee800810

从2.29版本开始,Git可以在完全SHA-1或完全SHA-256模式下运行。目前,使用不同对象格式的存储库不可能相互操作,但计划最终提供支持。还需要注意的是,在编写本文时,没有主要的提供商(包括GitHub)支持托管支持SHA-256的存储库。

在未来的版本中,Git将通过计算它写入的每个对象的SHA-1和SHA-256散列,并在它们之间存储转换表,来支持具有不同对象格式的存储库之间的互操作。这最终将允许使用SHA-256存储其对象的存储库与(足够最新的)SHA-1客户端和vice-versa交互。它还将允许转换后的SHA-256存储库对旧SHA-1提交的引用仍然正常工作(例如,如果我编写了一个提交,其消息通过其SHA-1名称引用了早期提交,那么即使在通过查询转换表将存储库转换为使用SHA-256之后,Git仍然能够遵循该引用)。

有关Git中SHA-256的更多信息,以及某些未来版本的外观,您可以阅读Git的过渡计划

[来源来源来源来源、和所以许多的更多]

负参考规范

当你跑步时git获取来源,所有远程分支起源存储库被提取到您的本地参考/遥控/原点/层次结构。Git如何知道要提取哪些分支,以及将它们放在哪里?

答案是,您的配置文件包含每个远程的一个或多个“refspecs”(请记住,“ref”是Git对历史中任何命名点的单词:分支、标记等)。当你跑步时git克隆,它设置了一个默认refspec,当您从原始存储库中提取时使用:

$git-config远程.origin.fetch
+refs/heads/*:refs/remotes/origin/*

这个refspec告诉Git获取冒号左侧的内容(参考/标题/; 即所有分支),并将其写入右侧的层次结构中。The *在左侧表示“匹配所有部件”,在右侧表示“替换为匹配部件”。

可以有多个refspec,它们可以引用单个ref。例如,此命令指示Git额外获取git注释从远程(--添加非常重要,这样我们就不会覆盖获取分支的默认refspec):

$git-config——添加remote.origin.fetch-refs/notes/commits:refs/notes/origin-notes

Refspec由使用git推送也是如此。即使你只打字git推送源mybranch,最后一个我的分支真的是refs/heads/mybranch:refs/heads/mybranch。这允许您表达更复杂的场景。假设您正在添加标签并希望推送所有标签,但您还没有准备好分享所有分支的提示。在这里,您可以这样写:

$git推送源'参考/标签/*:参考/标签/*'

在Git 2.29之前,refspecs只能用于表示您想要的参考选择。因此,如果要获取除一个分支之外的所有分支,则必须将它们作为参数逐个列出。当然,这假设您事先知道所有其他引用的名称,因此在实践中,这看起来像是:

$git ls远程原点'参考/标题/*' |
要排除的grep-v ref|
awk“{打印$2:$2}”|
xargs-git获取来源

让所有裁判上场参考/标题/*除了参考/标题/参考排除.Yeesh;一定有更好的方法。

在Git 2.29中,有:负参考规范。现在,如果refspec以^它指示要排除的引用。因此,代替上述内容,您可以写一些类似的内容:

$git获取来源'参考/标题/*:参考/标题/*'^参考/标题/参考排除

并达到同样的效果。当出现负refspec时,如果引用与至少一个正refspec匹配,并且不与任何负refspecs匹配,则服务器认为该引用值得发送。负值refspec的行为完全符合您的预期,但有几个警告:

  • 负refspec可以包含通配符模式,但不能指定目标。无论如何,这些都没有任何意义(你不会想说^refs/heads/foo/*:refs/heads/条/*字面意思是“地图头来自foo公司酒吧,但不要寄给我foo公司参考文献以“开头”)。要排除通配符refspec,只需编写^参考/标题/foo/*
  • 虽然正refspec可以通过对象id引用单个对象,但负refspec不能。

当然,这些负refspec在配置值中同样有效。如果你总是想取除foo公司,只需将其添加到配置中:

$git-config—添加remote.origin.fetch^refs/heads/foo

[来源]

新建git短日志技巧

虽然你几乎肯定使用过(或听说过)git日志,对于git短日志对于那些没有的人数位短对数行为很像git日志,除了不按顺序显示提交之外,它还按作者对其进行分组。

事实上,Git发行说明以发行版中所有补丁的简短日志结尾,这些补丁由作者列出,由git短日志 [来源]。在写作时,它们看起来像这样:

亚伦·利普曼(12岁):t6030:使“git-bisect-run”测试现代化rev-list:允许平分和第一父标记cmdbisect__helper:延迟解析no-checkout标志[...]阿德里安·莫恩尼奇(1):ci:修复不一致的缩进Alban Gruin(1):t6300:修复与%(内容:大小)相关的问题[...]

在旧版本的Git中git短日志只能按提交作者分组(默认行为),也可以按提交者身份分组(使用git短日志-c). 这限制了谁通过提交的作者/提交者获得提交的学分“合著者”预告片(比如在中提交吉特/吉特是的),那么你的合著者运气不好了:没有办法判断数位短对数将共同作者的提交分组。

……就是说,直到2点29分!在此版本中git短日志学习了一个新的--组参数,以指定如何对提交进行分组和分配信用。这需要--group=作者(之前的默认行为)和--group=提交人(相当于git短日志-c),但它也接受--组=拖车:<field>参数。

通过后者,我们可以将合作者的提交分组,还可以进行更多创造性的使用。如果您的项目使用审核人拖车,您可以使用git短日志查看谁查看的补丁最多:

$git shortlog-ns--group=拖车:由v2.28.0审查。。|封头-n5
40埃里克·阳光
10泰勒·布劳
4布莱恩·卡尔森
2以利亚·纽伦
1杰夫·金

git短日志还允许多个--组=<类型>参数,在这种情况下,每个分组计算一次提交。所以,如果你想看看谁是贡献无论该个人是主要作者还是合作作者,你都可以写:

$git shortlog-ns--group=author--group=tail:合著者

…使作者和合著者处于平等地位。您也可以使用--格式选择其他有趣的方式来显示数据。例如:

$git shortlog--格式="…在%上帮助了%an"--组=拖车:通过v2.28.0..v2.29.0帮助
克里斯·托雷克(3):
……在2020-08-12年帮助了雷内·沙菲
……在2020-08-12年帮助了雷内·沙菲
……在2020-08-12年帮助了雷内·沙菲

大卫·阿吉拉尔(1):
……于2020-05-07帮助林森

刘登顿(1):
……2020-08-21年帮助了Shourya Shukla

德里克·斯托利(2):
…在2020-08-25帮助Taylor Blau
……在2020-09-17年帮助了Taylor Blau

[...]

[来源]

小贴士

每根钢筋的git在Git 2.29中学习了一些新技巧。既然有很多,那么让我们从这里开始:

  • 每根钢筋的git通常输出每个ref的名称、类型和对象id,但您可以通过它了解更多信息--格式选项Git 2.29学习了一些新领域,包括内容:大小主题:消毒,并且更加一致:短获取缩写对象id的修饰符。最后几项是由Hariom Verma公司,一名从事Git项目的谷歌代码夏令营学生。[来源来源]
  • 每根钢筋的git现在可以取多个--合并--不带电参数,如果可以从至少一个参数访问引用,则打印引用--合并参数,并且无法从任何--未合并个。[来源]

现在有了所有每根钢筋的git更新到此为止,让我们继续了解其他所有花絮:

  • 当您的合并分支导致合并冲突,您会收到一条类似于以下内容的消息(此示例为由以利亚·纽伦提供):
    冲突(重命名/删除):b01dface中删除了foo.c。。。已删除不必要的东西,并在HEAD中重命名。foo.c左侧的版本HEAD在树上。

    你能说出这个消息的意思吗?在2.29之前的Git版本中,这是不明确的:Git是否删除了中的内容并重命名了文件头部或者“删除不必要的内容”是提交消息的名称吗?原来是后者,但你根本不知道!

    在2.29中,Git现在将提交消息的主题放在括号中,从而更清楚地说明冲突消息的哪一部分来自提交,以及Git生成了哪一部分。

    [来源]

  • 这里有一个简单的!Git支持一个名为合并.规范化以防你不熟悉Git的全部内容近5000条线路手动git-config,这里有一个复习:合并.规范化使Git签出并签入三向合并的每个阶段。如果您正在处理的两个分支之间的行行距发生更改,这将非常有用。此配置以前不会被选中git校验-m(和一些相关的调用),但现在它是![来源]
  • 在Git 2.26的亮点中,我们谈到了协议v2,这成为该版本的默认设置。在2.26到2.27之间,发现并修复了此新协议中的一个错误(请参阅4fa3f00abb型获取有趣的细节)。为了安全Git 2.27回到协议“v0”缓和过渡,以及标记特征为实验在Git 2.28中,现在我们已经有了一些机会来解决Git 2.28之后的任何遗留错误,协议v2被重新启用为Git 2.29中的默认协议[来源]
  • 二分查找是一个非常方便的工具,可以用来确定错误的来源。您标记一个“好”和“坏”端点,然后Git引导您在端点之间进行二进制搜索,以查找导致问题的提交。在Git 2.29中二分查找学习了一个新的--第一亲选项修改在这些端点之间遍历的提交。理解此选项的一种方法是想象一下通过合并进行二分操作时会发生什么。在之前,除了合并提交本身之外,您的二分操作还将包括要合并的分支上的提交。超车--第一亲告诉Git避免将仅位于要合并的分支上的提交视为潜在的错误源。如果您的工作流程是这样的,即只有主分支上的合并才是有趣的停止点(因为您主要通过合并拉请求来工作,并且每个拉请求可能都有进行中的提交,甚至可能不会构建),那么--第一亲让你跳过这一切。[来源]
  • Git可选地包括一个远程后端,用于从维基百科实例。它通常不受支持,默认情况下不编译,但最近发现的漏洞可能导致执行任意命令,此版本中已修补了该漏洞。请注意,只有当您对不受信任的mediawiki实例使用mediawiki后端时,才会受到此漏洞的影响(如果您必须问自己是否受到影响,很可能没有受到影响)。[来源]
  • Git使用低级git索引块命令以接收git推送或处理git获取在Git 2.29中git索引块学会了在多核机器上更高效地工作,这意味着只需升级,所有推送和获取都会更快。[来源来源]
  • 创建合并提交时,默认消息显示为“合并上游美元$目的地“。从历史上看,合并到主分支将省略”$目的地“部分。Git 2.29已学习合并.suppressDest配置。此多值配置变量中的任何分支都将导致合并分支省略“into”$目的地“部分。[来源]

卡布德尔

这只是最新版本中的更改示例。更多信息,请查看2.29的发行说明,或任何以前的版本英寸Git存储库

从GitHub了解更多信息

社区

社区

看看开源社区发生了什么。
GitHub环球2024

GitHub环球2024

获取AI、DevEx和安全全球开发者活动十周年门票。
GitHub Copilot公司

GitHub Copilot公司

不要独自飞行。免费试用30天。
在GitHub工作!

在GitHub工作!

查看我们当前的职位空缺。