#git-diff #git #diff #text #utility #cli

bin+lib git-blamediff

一个自动注释 git(1) 中文件更改的程序

2 个版本

0.1.1 2022 年 6 月 21 日
0.1.0 2022 年 5 月 27 日

#941 in 文本处理

GPL-3.0-or-later

18KB
72

git-blamediff

目的

git-blamediff 是一个程序,用于通过 SHA1 哈希标记在基状态中修改的相应行来注释 git 仓库中的更改。这个过程允许快速查找感兴趣的先前提交或创建修复提交。根据您的流程,后者可能对正确排序更改集中的先前提交非常有帮助。

用法

考虑以下示例,其中开发人员注意到他/她忘记在要打印的字符串上添加一个尾随换行符。代码尚未推送,因此修复感兴趣的提交是最好的选择。补丁如下所示

 --- main.c
 +++ main.c
@@ -6,6 +6,6 @@ int main(int argc, char const* argv[])
     fprintf(stderr, "Too many arguments.\n");
     return -1;
   }
-  printf("Hello world!");
+  printf("Hello world!\n");
   return 0;
 }

在仓库中可能进行了一些更改。如何找到引入初始(有误)行的提交?通常,人们会使用 git blamegit annotate 并通过注释的 diff 扫描以找到行和相应的 SHA1 哈希。这样做的话,人们要么必须手动检查整个注释文件以查找感兴趣的行,要么在文件中费力地找出修改过的行,并为 blame/annotate 调用制作和传递 -L 参数。

git-blamediff 可以用来自动化这个过程。它读取补丁,如上述示例,并自动在相应的行上调用 git 以打印其注释形式。例如

$ git diff --relative --no-prefix | git blamediff
--- main.c
+++ main.c
8d4442c  6)     fprintf(stderr, "Too many arguments.\n");
8d4442c  7)     return -1;
8d4442c  8)   }
bd7ee05  9)   printf("Hello world!");
bd7ee05 10)   return 0;
bd7ee05 11) }

此示例还说明了补丁正确注释所需具备的两个重要属性:它应包含相对于当前工作目录的路径(通过使用--relative参数)并且不包含前缀(即,不用a/some-path/some-file,而是使用some-path/some-file;通过向git提供--no-prefix选项来实现)。

这些要求是为了保持程序简洁,并避免处理过多的特殊情况。由于在正常情况下,人们会创建一个别名来缩短之前显示的git diff调用,因此这个属性并不被视为限制(有关此类别名的示例,请参阅安装部分)。

继续工作流程,可以创建一个修复提交,然后,在某个时候,执行交互式变基,以自动修改原始更改,例如:

$ git add --all
$ git commit --fixup bd7ee05
...
$ git rebase --interactive --autosquash bd7ee05^

安装

git-blamediff是用Rust编写的,需要Cargo包管理器来构建。可以使用cargo install git-blamediff来安装。

一旦安装,由于程序名称,git将直接识别该命令,因此可以按git blamediff调用,也可以通过git-blamediff调用。

为了简化使用,应该引入一个git别名。用于注释当前未暂存的(git bd -- "git blame diff")和已暂存的(git bds -- "git blame diff staged")更改的别名可能如下所示

[alias]
  bd = "!bd() { git diff --relative --no-prefix | git blamediff; }; bd"
  bds = "!bds() { git diff --relative --no-prefix --staged | git blamediff; }; bds"

依赖关系

~2.9–4MB
~68K SLoC