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.verbatim 为 true,则这是默认值。
--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
git(1) 套件的一部分
