如何在git diff标头中控制哈希长度

时间:2019-01-14 19:54:15

标签: git git-diff

git diff的输出包含一个标题,如下所示:

index f8fdb16de,78132574a..000000000

git help diff中,解释如下:

2. It is followed by one or more extended header lines (this example shows a merge with two parents):

       index <hash>,<hash>..<hash>
       mode <mode>,<mode>..<mode>
       new file mode <mode>
       deleted file mode <mode>,<mode>

我想使用git diff创建补丁,并且我希望这些补丁具有可预测的格式,以便可以对其进行比较。为此,我需要在“ index ..”标头中为哈希提供固定长度。

如何控制这些哈希的长度?

我尝试了--abbrev = 7,但似乎没有效果。

我仍然看到我的补丁程序是这样更新的:

-index 52a2a35..7813257 100755
+index 52a2a357e..78132574a 100755

2 个答案:

答案 0 :(得分:5)

--abbrev选项仅适用于“差异原始格式输出和差异树标题行”。对于标准补丁输出,可以使用git diff --full-index获取完整的,未缩写的Blob ID。来自man page

  

--full-index
             而不是前几个字符,显示完整的前置和              生成时在“索引”行上的图像后blob对象名称              补丁格式输出。

这将产生如下输出:

diff --git a/foo b/foo
index c7bc37b70c7e29e3e4ed048c22ca3929367aa171..ab10096fde76d8c1d6172bd09d0dc4a18fb2c2fa 100644
Binary files a/foo and b/foo differ

答案 1 :(得分:1)

我尝试了--abbrev=7,但似乎没有效果。
因此无法获得固定的缩写长​​度?

它是(但仅在使用Git 2.29(2020年第4季度)时):之前,“ diff”系列命令的输出缩写了补丁中涉及的Blob的对象名称,但其长度为< em>不受的影响,受--abbrev选项的影响。
现在是了。

请参见commit 3046c7fĐoàn Trần Công Danh (sgn)(2020年8月21日)。
请参见commit fc7e73dbrian m. carlson (bk2204)(2020年8月21日)。
(由Junio C Hamano -- gitster --commit 096c948中合并,2020年8月31日)

diff:索引行:在对象名称中尊重--abbrev

签名人:ĐoànTrầnCôngDanh

Git的少数几个命令--abbrev自定义对象名称的缩写长度。

对于差异家庭,Git支持2种不同的选项,用于2种不同的目的:

  • --full-index用于完整显示差异修补程序对象的名称,并且
  • --abbrev用于自定义diff-raw和diff-tree标头行中对象名称的长度,而没有用于自定义diff-patch格式的对象名称长度的任何选项。

使用diff-patch格式时,我们只有两个选项,即全索引或默认的缩写长度。

尽管已记录了该行为,但并没有阻止用户尝试使用--abbrev,而是希望自定义diff-patch对象名称的缩写。

让我们将“ index”行上显示的对象对象名称缩写为通过“ --abbrev”选项指定的任意长度。

要保持与同时指定--full-index--abbrev的旧脚本的向后兼容性,如果指定了--full-index,则始终显示完整的对象ID。

diff-options现在包含在其man page中:

在差异修补程序输出格式中,--full-index的优先级更高,即,如果指定了--full-index,则将显示完整的Blob名称,而与--abbrev无关。

可以使用--abbrev=<n> 指定非默认位数。


关于“ --abbrev=<n>”选项的文档并未说输出可能比“ <n>”十六进制数长,这在Git 2.30(2021年第一季度)中得到了澄清。 )。

请参见commit cda34e0Junio C Hamano (gitster)(2020年11月4日)。
(由Junio C Hamano -- gitster --commit ee13beb中合并,2020年11月11日)

doc:说明--abbrev=<n>大约是最小长度

帮助:Derrick Stolee

2006年早期的文字说明了“ --abbrev=<n>”选项为“仅显示部分前缀”,而不必说部分前缀的长度不一定是为确保输出而指定给该选项的数字唯一地命名对象。

更新diff系列命令的文档“ blame”,“ branch --verbose”,“ ls-files”和“ ls-tree”,以强调必须使用短前缀唯一地引用一个对象,仅是前缀中使用的最小十六进制数。

diff-options现在包含在其man page中:

行,显示最短前缀,至少为'<n>' 十六进制长,唯一引用对象。

git blame现在包含在其man page中:

缩写的对象名称,使用<m>+1位数字,其中<m>至少为<n>,但要确保提交对象名称是唯一的。

git branch现在包含在其man page中:

--abbrev=<n>

在显示提交对象名称的详细列表中, 显示至少为“ <n>”十六进制数字的最短前缀 唯一引用对象的时间。