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

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

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

.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]删除
最新教程 更多>
  • `console.log`显示修改后对象值异常的原因
    `console.log`显示修改后对象值异常的原因
    foo = [{id:1},{id:2},{id:3},{id:4},{id:id:5},],]; console.log('foo1',foo,foo.length); foo.splice(2,1); console.log('foo2', foo, foo....
    编程 发布于2025-05-01
  • input: Why Does "Warning: mysqli_query() expects parameter 1 to be mysqli, resource given" Error Occur and How to Fix It?

output: 解决“Warning: mysqli_query() 参数应为 mysqli 而非 resource”错误的解析与修复方法
    input: Why Does "Warning: mysqli_query() expects parameter 1 to be mysqli, resource given" Error Occur and How to Fix It? output: 解决“Warning: mysqli_query() 参数应为 mysqli 而非 resource”错误的解析与修复方法
    mysqli_query()期望参数1是mysqli,resource给定的,尝试使用mysql Query进行执行MySQLI_QUERY_QUERY formation,be be yessqli:sqli:sqli:sqli:sqli:sqli:sqli: mysqli,给定的资源“可能发...
    编程 发布于2025-05-01
  • 如何在php中使用卷发发送原始帖子请求?
    如何在php中使用卷发发送原始帖子请求?
    如何使用php 创建请求来发送原始帖子请求,开始使用curl_init()开始初始化curl session。然后,配置以下选项: curlopt_url:请求 [要发送的原始数据指定内容类型,为原始的帖子请求指定身体的内容类型很重要。在这种情况下,它是文本/平原。要执行此操作,请使用包含以下标头...
    编程 发布于2025-05-01
  • Android如何向PHP服务器发送POST数据?
    Android如何向PHP服务器发送POST数据?
    在android apache httpclient(已弃用) httpclient httpclient = new defaulthttpclient(); httppost httppost = new httppost(“ http://www.yoursite.com/script.p...
    编程 发布于2025-05-01
  • 为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    class'ziparchive'在Linux Server上安装Archive_zip时找不到错误 commant in lin ins in cland ins in lin.11 on a lin.1 in a lin.11错误:致命错误:在... cass中找不到类z...
    编程 发布于2025-05-01
  • 同实例无需转储复制MySQL数据库方法
    同实例无需转储复制MySQL数据库方法
    在同一实例上复制一个MySQL数据库而无需转储在同一mySQL实例上复制数据库,而无需创建InterMediate sqql script。以下方法为传统的转储和IMPORT过程提供了更简单的替代方法。 直接管道数据 MySQL手动概述了一种允许将mysqldump直接输出到MySQL clie...
    编程 发布于2025-05-01
  • 如何使用Regex在PHP中有效地提取括号内的文本
    如何使用Regex在PHP中有效地提取括号内的文本
    php:在括号内提取文本在处理括号内的文本时,找到最有效的解决方案是必不可少的。一种方法是利用PHP的字符串操作函数,如下所示: 作为替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式来搜索特...
    编程 发布于2025-05-01
  • 如何在GO编译器中自定义编译优化?
    如何在GO编译器中自定义编译优化?
    在GO编译器中自定义编译优化 GO中的默认编译过程遵循特定的优化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    编程 发布于2025-05-01
  • Go web应用何时关闭数据库连接?
    Go web应用何时关闭数据库连接?
    在GO Web Applications中管理数据库连接很少,考虑以下简化的web应用程序代码:出现的问题:何时应在DB连接上调用Close()方法?,该特定方案将自动关闭程序时,该程序将在EXITS EXITS EXITS出现时自动关闭。但是,其他考虑因素可能保证手动处理。选项1:隐式关闭终止数...
    编程 发布于2025-05-01
  • CSS强类型语言解析
    CSS强类型语言解析
    您可以通过其强度或弱输入的方式对编程语言进行分类的方式之一。在这里,“键入”意味着是否在编译时已知变量。一个例子是一个场景,将整数(1)添加到包含整数(“ 1”)的字符串: result = 1 "1";包含整数的字符串可能是由带有许多运动部件的复杂逻辑套件无意间生成的。它也可以是故意从单个真理...
    编程 发布于2025-05-01
  • 如何从Google API中检索最新的jQuery库?
    如何从Google API中检索最新的jQuery库?
    从Google APIS 问题中提供的jQuery URL是版本1.2.6。对于检索最新版本,以前有一种使用特定版本编号的替代方法,它是使用以下语法:获取最新版本:未压缩)While these legacy URLs still remain in use, it is recommended ...
    编程 发布于2025-05-01
  • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
    编程 发布于2025-05-01
  • 如何克服PHP的功能重新定义限制?
    如何克服PHP的功能重新定义限制?
    克服PHP的函数重新定义限制在PHP中,多次定义一个相同名称的函数是一个no-no。尝试这样做,如提供的代码段所示,将导致可怕的“不能重新列出”错误。 但是,PHP工具腰带中有一个隐藏的宝石:runkit扩展。它使您能够灵活地重新定义函数。 runkit_function_renction_re...
    编程 发布于2025-05-01
  • Python元类工作原理及类创建与定制
    Python元类工作原理及类创建与定制
    python中的metaclasses是什么? Metaclasses负责在Python中创建类对象。就像类创建实例一样,元类也创建类。他们提供了对类创建过程的控制层,允许自定义类行为和属性。在Python中理解类作为对象的概念,类是描述用于创建新实例或对象的蓝图的对象。这意味着类本身是使用类关...
    编程 发布于2025-05-01
  • CSS直接定位文本节点及克服限制方法
    CSS直接定位文本节点及克服限制方法
    用CSS来定位文本节点:限制和解决方案遇到涉及文本节点的测试用例时,识别此限制至关重要。如CSS规范中概述的匿名框,从封闭的非匿名盒中接收其属性。但是,它们保留了非属性属性的初始值。如果在HTML标签中包装文本节点是不切实际的,则另一种方法是设置容器样式。对于可以针对目标的文本,您可以根据需要覆盖...
    编程 发布于2025-05-01

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

Copyright© 2022 湘ICP备2022001581号-3