Skip to content

git-patch-id

为补丁计算唯一 ID。

概要

bash
git patch-id [--stable | --unstable | --verbatim]

描述

从标准输入读取补丁并计算补丁 ID。

"补丁 ID"不过是与补丁关联的文件差异的 SHA-1 之和,忽略行号。因此,它是"相当稳定的",但同时也相当唯一,即两个具有相同"补丁 ID"的补丁几乎可以保证是同一个东西。

此命令的主要用例是查找可能重复的提交。

处理 git diff-tree --patch 输出时,它利用了补丁以提交的对象名为前缀的事实,并输出两个 40 字节的十六进制字符串。第一个字符串是补丁 ID,第二个字符串是提交 ID。这可用于为一组或一系列提交创建从补丁 ID 到提交 ID 的映射。

选项

--verbatim

:按原样计算输入的补丁 ID,不剥离任何空白。隐含 --stable 并禁止 --unstable。如果 patchid.verbatimtrue,则这是默认值。

--stable

:使用"稳定"的哈希和作为补丁 ID。使用此选项时:

  • 组成补丁的文件差异重新排序不会影响 ID。特别是,通过使用不同的 -O<orderfile> 设置比较相同的两棵树产生的两个补丁会产生相同的补丁 ID 签名,从而使计算结果可用作两棵树之间变更的元信息索引键。
  • 结果与 Git 1.9 及更早版本产生的值或配置了"unstable"哈希(见下面的 --unstable)时产生的值不同——即使在不使用 -O<orderfile> 的差异输出上使用也是如此,从而使存储此类"unstable"或历史补丁 ID 的现有数据库无法使用。
  • 补丁中的所有空白都被忽略,不影响 ID。

如果 patchid.stable 设置为 true,则这是默认值。

--unstable

:使用"unstable"哈希作为补丁 ID。使用此选项时,产生的结果与 Git 1.9 及更早版本产生的补丁 ID 值兼容,空白被忽略。拥有由 Git 1.9 及更早版本产生的补丁 ID 的现有数据库的用户(不处理重新排序的补丁)可能希望使用此选项。 这是默认值。

示例

git-cherry(1) 显示分支中哪些提交在某个上游分支中具有补丁 ID 等效的提交。但它只告诉您是否存在这样的提交。如果您想知道上游中的相关提交怎么办?我们可以使用此命令在您的分支和上游分支之间创建映射:

sh
#!/bin/sh

upstream="$1"
branch="$2"
test -z "$branch" && branch=HEAD
limit="$3"
if test -n "$limit"
then
    tail_opts="$limit".."$upstream"
else
    since=$(git log --format=%aI "$upstream".."$branch" | tail -1)
    tail_opts=--since="$since"' '"$upstream"
fi
for_branch=$(mktemp)
for_upstream=$(mktemp)

git rev-list --no-merges "$upstream".."$branch" |
    git diff-tree --patch --stdin |
    git patch-id  --stable | sort >"$for_branch"
git rev-list --no-merges $tail_opts |
    git diff-tree --patch --stdin |
    git patch-id  --stable | sort >"$for_upstream"
join -a1 "$for_branch" "$for_upstream" | cut -d' ' -f2,3
rm "$for_branch"
rm "$for_upstream"

现在第一列显示您分支中的提交,第二列显示补丁 ID 等效的提交(如果存在)。

另请参阅

git-cherry(1)

Git

git(1) 套件的一部分

基于 CC BY-NC-SA 3.0 许可发布