”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > `.git-blame-ignore-revs` 忽略批量格式更改。

`.git-blame-ignore-revs` 忽略批量格式更改。

发布于2024-11-03
浏览:552

.git-blame-ignore-revs 是 2.23 版本中引入的一项 Git 功能,允许您忽略 git Blame 结果中的特定提交。这对于在不改变代码实际功能的情况下更改大量行的批量提交特别有用,例如格式更改、重命名或在代码库中应用编码标准。通过忽略这些非功能性更改,gitblame 可以专注于有意义的编辑,解释代码背后的上下文和推理。

为什么 .git-blame-ignore-revs 很重要

当您在文件上使用 gitblame 时,它​​会显示最后一次更改文件每一行的提交,以及作者和时间戳。这对于追踪特定行被更改的原因非常有用。但是,如果进行纯粹格式更改(例如应用更漂亮)的大型提交是历史记录的一部分,则 gitblame 可能会指向许多行的该提交。这使得很难找到实际的功能变化历史。

例如,如果您的团队使用 Prettier 或 ESLint 等工具重新格式化整个代码库,则生成的提交可能会涉及数千行代码。如果没有 .git-blame-ignore-revs,gitblame 会将此提交显示为对每个受影响的行负责,这可能会掩盖每行背后更有意义的历史记录。

通过使用 .git-blame-ignore-revs,您可以告诉 gitblame 跳过这些提交并专注于重要的更改。

如何使用 .git-blame-ignore-revs

要了解如何使用此功能,让我们看一下 React 存储库中的示例。

第 1 步:识别批量格式化提交

React 源代码包括批量提交,其中 Prettier 等工具在整个项目中运行。这是两个这样的提交:

`.git-blame-ignore-revs` to ignore bulk formatting changes.

  1. 提交: c998bb1 消息:[编译器]运行更漂亮,修复快照 此提交在整个代码库中应用了 Prettier 格式,在不改变功能的情况下更改了许多行。

`.git-blame-ignore-revs` to ignore bulk formatting changes.

2.提交: fd2b3e1

消息:编译器:Unfork prettier config

此提交包含对 Prettier 配置的进一步更新,影响存储库中的所有 .ts 和 .tsx 文件。

`.git-blame-ignore-revs` to ignore bulk formatting changes.

这些提交仅处理格式,在调查一行代码为何如此编写时不提供有意义的上下文。

第 2 步:创建 .git-blame-ignore-revs 文件

为了让 gitblame 忽略这些批量格式化提交,我们可以在存储库的根目录中创建一个 .git-blame-ignore-revs 文件。

  1. 创建 .git-blame-ignore-revs 文件:
touch .git-blame-ignore-revs

2.将相关提交哈希添加到文件中,解释为什么每个提交都被忽略。在这种情况下,我们将添加之前确定的两个提交:

# Prettier formatting changes 
c998bb1ed4b3285398c9c7797135d3f060243c6a 
fd2b3e13d330a4559f5aa21462e1cb2cbbcf144b

3.将 .git-blame-ignore-revs 文件保存在存储库中。该文件可以与您的代码一起进行版本控制,从而允许整个团队使用相同的忽略提交列表。

第 3 步:配置 Git 使用 .git-blame-ignore-revs

为了避免每次使用 git Blame 时都键入 --ignore-revs-file 选项,您可以将 Git 配置为自动使用 .git-blame-ignore-revs 文件。

  1. 在存储库级别设置配置:
git config blame.ignoreRevsFile .git-blame-ignore-revs

这可以确保每次有人在此存储库中运行 git Blame 时,Git 都会自动忽略 .git-blame-ignore-revs 中列出的提交。

第 4 步:运行 git Blame 并忽略提交

让我们看看这在实践中是如何运作的。在不忽略批量格式化提交的情况下,gitblame可能会显示:

$ git blame src/someFile.tsx
c998bb1e (Joe Bloggs 2023-03-15 10:00:00  0200 1) import React from 'react';
fd2b3e13 (Alan 2023-04-01 14:15:30  0200 2) function App() {
c998bb1e (Joe Bloggs 2023-03-15 10:00:00  0200 3)     return 
Hello, world!
; fd2b3e13 (Ben 2023-04-01 14:15:30 0200 4) }

此输出表明对第 1 行和第 3 行的最后更改是由于 Prettier 格式化提交 (c998bb1e) 造成的,第 2 行和第 4 行在另一个批量提交 (fd2b3e13) 中进行了修改。由于这些是格式更改,这对于理解谁引入了这些行背后的实际逻辑没有帮助。

配置 .git-blame-ignore-revs 后,运行 gitblame 将跳过批量提交并显示真实历史记录:

$ git blame src/someFile.tsx
a23d9b34 (May 2022-12-01 09:30:00  0200 1) import React from 'react';
b12e45a6 (JJ 2022-12-05 11:45:15  0200 2) function App() {
a23d9b34 (Joe 2022-12-01 09:30:00  0200 3)     return 
Hello, world!
; b12e45a6 (Ram 2022-12-05 11:45:15 0200 4) }

现在, gitblame 将这些行归因于正确的提交,忽略不重要的格式更改。这为我们提供了有用的信息,显示谁进行了实际的功能更改。

结论

Git 2.23 中的 .git-blame-ignore-revs 功能是批量格式化或样式更改项目的游戏规则改变者。通过设置 .git-blame-ignore-revs 文件并配置存储库,您可以应用编码标准、运行 Prettier 等工具或重构代码,而不必担心污染指责历史记录。

通过这种方法,您的团队可以自信地提高代码质量和格式,而无需牺牲跟踪有意义的更改的能力,确保 git Should 仍然是理解每行代码背后的历史和推理的宝贵工具。

关于我们:

在 Think Throo,我们的使命是教授开源项目中使用的高级代码库架构概念。

通过在 Next.js/React 中练习高级架构概念,提高您的编码技能,学习最佳实践并构建生产级项目。

我们是开源的 — https://github.com/thinkthroo/thinkthroo (请给我们一颗星!)

通过我们基于代码库架构的高级课程来提高您的团队技能。请通过 [email protected] 联系我们了解更多信息!

参考:

  1. https://github.com/facebook/react/blob/main/.git-blame-ignore-revs

  2. https://gist.github.com/kateinoigakukun/b0bc920e587851bfffa98b9e279175f2

  3. https://github.com/facebook/react/commit/c998bb1ed4b3285398c9c7797135d3f060243c6a

  4. https://moxio.com/blog/ignoring-bulk-change-commits-with-git-blame/



版本声明 本文转载于:https://dev.to/thinkthroo/git-blame-ignore-revs-to-ignore-bulk-formatting-changes-5fee?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 为 macOS 构建市政厅时钟应用程序:综合指南
    为 macOS 构建市政厅时钟应用程序:综合指南
    准备好为您的 Mac 构建一个很酷的市政厅时钟应用程序了吗?伟大的!我们将创建一个位于菜单栏中的应用程序,每 15 分钟发出一次提示音,甚至可以计算时间。让我们一步步分解,我将解释代码的每一部分,以便您能够理解发生了什么。 项目概况 我们的市政厅时钟应用程序将: 在 macOS 菜单...
    编程 发布于2024-11-03
  • 如何在 JavaScript 中创建异步循环?
    如何在 JavaScript 中创建异步循环?
    JavaScript 中的异步循环虽然 JavaScript 提供了各种类型的循环,但是可以创建暂停执行以等待异步调用的循环具有挑战性的。这是因为混合同步和异步代码可能会导致意外行为。解决方案:采用异步方法要克服此限制,有必要完全拥抱事件JavaScript 驱动的方法。这涉及使用异步调用完成时将调...
    编程 发布于2024-11-03
  • 降低性能的两行 CSS(fps 到 ps)
    降低性能的两行 CSS(fps 到 ps)
    我最近发布了《学习厕所》,如果您看过它,您可能会注意到背景中的动画,其中彩色圆圈在屏幕上对角移动。看起来像这样: 它在 Chrome 和 Safari 上运行良好,但我注意到 Firefox 上的性能严重下降。 性能太差了,我直接在 Firefox 中禁用了这个动画。 动...
    编程 发布于2024-11-03
  • 如何在 React 中使用上下文
    如何在 React 中使用上下文
    欢迎回来,朋友们!
 今天我们将回顾名为 useContext 的 React Hook 的基础知识。 useContext 是一个强大的工具,它比 useState 更进一步,创建了一个类似全局的 State,可以将信息传递给子组件和孙组件,而无需直接传递 props。
 但我有点超前了。
如果你...
    编程 发布于2024-11-03
  • JavaScript 可以修改 PHP 会话变量吗?
    JavaScript 可以修改 PHP 会话变量吗?
    使用 JavaScript 设置 PHP 会话变量你可以使用 JavaScript 操作 PHP 会话变量吗?是的,您可以通过 AJAX 请求使用 JavaScript 设置 PHP 会话变量。操作方法如下:JavaScript 代码:jQuery('#div_session_write').loa...
    编程 发布于2024-11-03
  • Babel 6 修改后的默认导出行为有何影响和解决方法?
    Babel 6 修改后的默认导出行为有何影响和解决方法?
    Babel 6 修改后的默认导出行为:从方便到语义一致性的转变在一项突破性的改变中,Babel 6 修改了其方法导出默认值,引入从之前受 CommonJS 启发的行为到严格的 ES6 原则的转变。这一变化给开发者带来了机遇和挑战。此前,Babel 在默认导出声明中添加了一行“module.expor...
    编程 发布于2024-11-03
  • 如何识别数据框中具有部分字符串匹配的列?
    如何识别数据框中具有部分字符串匹配的列?
    识别名称中包含部分字符串的列在数据框中,您的任务是查找名称部分与特定字符串。与精确匹配不同,要求是识别包含字符串“spike”但可能在其之前或之后包含其他字符的列,例如“spike-2”、“hey spike”或“spiked-in”。 为了实现这一点,我们可以利用循环来迭代数据框的列名称。在此循环...
    编程 发布于2024-11-03
  • 用一个简单的属性来加速你的 CSS
    用一个简单的属性来加速你的 CSS
    您知道吗,您可以通过使用 all: unset; 来大幅减小 CSS 文件大小?这会重置元素上的所有属性,一次性清除所有继承的样式,使您的 CSS 更精简且更易于管理。 尝试一下,看看您的代码变得多么干净!如何管理继承的样式?
    编程 发布于2024-11-03
  • TypeScript 冒险与类型挑战 – Day Pick
    TypeScript 冒险与类型挑战 – Day Pick
    大家好。 我正在解决类型挑战,以更深入地研究 TypeScript。 今天,我想分享一下我对Pick的了解。 - 挑战 - interface Todo { title: string description: string completed: boolean } ty...
    编程 发布于2024-11-03
  • 如何扩展 JavaScript 中的内置错误对象?
    如何扩展 JavaScript 中的内置错误对象?
    扩展 JavaScript 中的 Error要扩展 JavaScript 中的内置 Error 对象,您可以使用 extends 关键字定义 Error 的子类。这允许您使用附加属性或方法创建自定义错误。在 ES6 中,您可以定义自定义错误类,如下所示:class MyError extends E...
    编程 发布于2024-11-03
  • 将测试集中在域上。 PHPUnit 示例
    将测试集中在域上。 PHPUnit 示例
    介绍 很多时候,开发人员尝试测试 100%(或几乎 100%)的代码。显然,这是每个团队应该为他们的项目达到的目标,但从我的角度来看,只应该完全测试整个代码的一部分:您的域。 域基本上是代码中定义项目实际功能的部分。例如,当您将实体持久保存到数据库时,您的域不负责将其持久保存在数据...
    编程 发布于2024-11-03
  • 如何使用 SQL 搜索列中的多个值?
    如何使用 SQL 搜索列中的多个值?
    使用 SQL 在列中搜索多个值构建搜索机制时,通常需要在同一列中搜索多个值场地。例如,假设您有一个搜索字符串,例如“Sony TV with FullHD support”,并且想要使用该字符串查询数据库,将其分解为单个单词。通过利用 IN 或 LIKE 运算符,您可以实现此功能。使用 IN 运算符...
    编程 发布于2024-11-03
  • 如何安全地从 Windows 注册表读取值:分步指南
    如何安全地从 Windows 注册表读取值:分步指南
    如何安全地从 Windows 注册表读取值检测注册表项是否存在确定注册表项是否存在:LONG lRes = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Perl", 0, KEY_READ, &hKey); if (lRes...
    编程 发布于2024-11-03
  • Staat源码中的useBoundStoreWithEqualityFn有解释。
    Staat源码中的useBoundStoreWithEqualityFn有解释。
    在这篇文章中,我们将了解Zustand源码中useBoundStoreWithEqualityFn函数是如何使用的。 上述代码摘自https://github.com/pmndrs/zustand/blob/main/src/traditional.ts#L80 useBoundStoreWithE...
    编程 发布于2024-11-03
  • 如何使用 Go 安全地连接 SQL 查询中的字符串?
    如何使用 Go 安全地连接 SQL 查询中的字符串?
    在 Go 中的 SQL 查询中连接字符串虽然文本 SQL 查询提供了一种简单的数据库查询方法,但了解将字符串文字与值连接的正确方法至关重要以避免语法错误和类型不匹配。提供的查询语法:query := `SELECT column_name FROM table_name WHERE ...
    编程 发布于2024-11-03

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3