2 个版本
0.1.1 | 2022 年 6 月 21 日 |
---|---|
0.1.0 | 2022 年 5 月 27 日 |
#941 in 文本处理
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 blame
或 git 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