为什么git怪--ignore-rev /-ignore-revs-file对我不起作用?

时间:2019-12-30 21:55:25

标签: git ignore revision-history

git blame --ignore-revs-file显然是现代Git中存在的一个选项。

只有一个问题。它不起作用。

或者至少对我不起作用:

您可以在shell脚本中添加它:

mkdir -p /tmp/blarp
cd /tmp/blarp
git init
cat << EOF > file.txt
one
two
three
EOF
git add file.txt
git commit --author "One <one@example.com>" -m 'one commit'
cat << EOF > file.txt
one
awesome
three
EOF
git add file.txt
git commit --author "Two <two@example.com>" -m 'two commits'
cat << EOF > file.txt
one
awesome
sauce
EOF
git add file.txt
git commit --author "One <one@example.com>" -m 'three commits'
git rev-parse HEAD~1 > ignore.txt
git blame --ignore-revs-file=ignore.txt file.txt

对我来说,这表明:

^b6d40d5 (One 2019-12-30 21:47:15 +0000 1) one
1c185c4c (Two 2019-12-30 21:47:15 +0000 2) awesome
d8b9bafd (One 2019-12-30 21:47:15 +0000 3) sauce

但是我希望看到

^b6d40d5 (One 2019-12-30 21:47:15 +0000 1) one
^b6d40d5 (One 2019-12-30 21:47:15 +0000 2) two
d8b9bafd (One 2019-12-30 21:47:15 +0000 3) sauce

^b6d40d5 (One 2019-12-30 21:47:15 +0000 1) one
d8b9bafd (One 2019-12-30 21:47:15 +0000 2) awesome
d8b9bafd (One 2019-12-30 21:47:15 +0000 3) sauce

但事实并非如此。我确实发现,如果更改仅是 空格更改,它们将被忽略...但是git文档对此并不明确,只是建议:

  

-ignore-revs文件

     

忽略文件中列出的修订,修订的格式必须与fsck.skipList相同。可以重复执行此选项,并且将在使用blame.ignoreRevsFile配置选项指定的任何文件之后处理这些文件。空文件名“”将清除以前处理过的文件的转速列表。

任何线索为何git blame --ignore-revs-file=revs-to-ignore似乎对我来说无法正常工作?

2 个答案:

答案 0 :(得分:1)

检查Git 2.29(2020年第4季度)是否已解决以下问题:“ git blame --ignore-rev/--ignore-revs-fileman无法验证其输入是否为有效修订,并且无法接受考虑到用户可能希望提供带注释的标签而不是已纠正的提交。

请参见commit 610e2b9commit f58931cJunio C Hamano (gitster)(2020年9月24日)。
(由Junio C Hamano -- gitster --commit 230ff3e中合并,2020年10月4日)

blame:验证并剥离忽略列表上的对象名称

该命令从命令行或从文件中读取要放置在忽略列表中的对象名称列表,但是不会使用对象类型对其进行检查(甚至不会检查从文件读取的对象名称是否存在对象)。

扩展oidset_parse_file() API并允许其采取可用于终止的回调(例如,当读取了不适当的输入时)或修改读取的对象名称(例如,在读取指向提交的标记时) ,并且调用方需要一个提交对象名称),并在处理忽略列表的代码中使用它。


在Git 2.30(Q1 2021)中,“ git blame --ignore-revs-file=<file> man”学会了忽略输入中不存在的对象名称,而不是抱怨。 / p>

请参见commit c714d05René Scharfe (rscharfe)(2020年11月10日)。
(由Junio C Hamano -- gitster --commit b4e245a中合并,2020年11月18日)

blame:静默忽略无效的忽略文件对象

举报人:让·伊夫·阿维纳德(Jean-Yves Avenard)
签名人:RenéScharfe
评论人:Barret Rhoden

由于610e2b9240(“ blame:验证并剥离忽略列表上的对象名称”,2020-09-24,Git v2.29.0-rc0-merge batch #19git blame man报告检查是否使用--ignore-rev指定的对象以及是否装载了--ignore-revs-file和配置选项{ {1}}是实际的对象,如果不是,则是模具。目的是向用户报告错字。

这也破坏了将单个忽略文件用于多个存储库的功能。
错别字在文件中的可能性大概比在命令行上低,因此在此处发出警报的作用较小。
通过跳过不提交而不会死的恢复该功能。

答案 1 :(得分:1)

TL;DR:ignore-revs 功能旨在重构提交,而不是完全更改行的提交。

嗨,韦恩,

感谢您的试用。抱歉,您第一次使用它的体验并不好。我认为可以改进文档以更好地传达该功能的意图。

git blame --ignore-rev 正在尝试查找有点类似于“awesome”的行。但是“awesome”和“two”没有任何共同点,因此它放弃并将“awesome”归因于添加它的实际提交。

有一个功能可以识别这种情况,但需要明确启用:

<块引用>

如果设置了blame.markUnblamableLines 配置选项,那么那些被我们无法归因于另一个修订版的被忽略提交所触及的行会被标记为*。

使用此选项,在您的示例脚本中,我看到一个 * 来指示问题:

^6bce3bb (One 2021-03-28 15:08:08 +0100 1) one
*b75aaf2 (Two 2021-03-28 15:08:08 +0100 2) awesome
5d3b18c7 (One 2021-03-28 15:08:08 +0100 3) sauce

如果您在真正想要忽略的提交上尝试 git blame --ignore-rev(例如 reformatting your code),那么它应该可以正常工作。

例如,如果我更改您的脚本以将 two 替换为 awesome TWO,那么我会看到:

^5307c74 (One 2021-03-28 15:14:52 +0100 1) one
^5307c74 (One 2021-03-28 15:14:52 +0100 2) awesome TWO
9d3fcc01 (One 2021-03-28 15:14:52 +0100 3) sauce