git-patch-id
Название
git-patch-id — вычисление уникальных идентификаторов патчей
Краткое описание
git patch-id [--stable | --unstable | --verbatim]
Описание
Читает патчи из стандартного ввода и вычисляет идентификаторы патчей.
«Идентификатор патча» — это не что иное, как сумма SHA-1 различий файлов, связанных с патчем, без учёта номеров строк. Поэтому он «достаточно стабилен», но в то же время и достаточно уникален: два патча с одинаковым «идентификатором патча» почти наверняка совпадают.
Основное применение этой команды — поиск вероятных дубликатов коммитов.
При работе с выводом git diff-tree --patch команда использует тот факт, что перед патчем указано имя объекта коммита, и выводит две 40-байтовые шестнадцатеричные строки. Первая строка — это идентификатор патча, а вторая — идентификатор коммита. Это можно использовать для создания соответствия между идентификаторами патчей и идентификаторами коммитов для набора или диапазона коммитов.
Параметры
-
--verbatim -
Вычислять идентификатор патча для входных данных в исходном виде, не удаляя пробелы. Подразумевает
--stableи запрещает--unstable.Используется по умолчанию, если для
patchid.verbatimзадано значениеtrue. -
--stable -
Использовать «стабильную» сумму хешей в качестве идентификатора патча. При использовании этого параметра:
-
Изменение порядка различий файлов, составляющих патч, не влияет на идентификатор. В частности, два патча, созданные путём сравнения одних и тех же двух деревьев с разными настройками
-O<orderfile>, дают одинаковую сигнатуру идентификатора патча, поэтому вычисленный результат можно использовать как ключ для индексации метаданных об изменениях между этими двумя деревьями. -
Результат отличается от значения, полученного в Git 1.9 и более ранних версиях или при настройке «нестабильного» хеша (см.
--unstableниже), даже если он применяется к выводу diff, полученному без использования-O<orderfile>. Поэтому существующие базы данных, содержащие такие «нестабильные» или исторические идентификаторы патчей, становятся непригодными для использования. -
Все пробельные символы в патче игнорируются и не влияют на идентификатор.
Используется по умолчанию, если для
patchid.stableзадано значениеtrue. -
-
--unstable -
Использовать «нестабильный» хеш в качестве идентификатора патча. При использовании этого параметра результат совместим со значением идентификатора патча, полученным в Git 1.9 и более ранних версиях; пробельные символы игнорируются. Пользователям, у которых есть существующие базы данных с идентификаторами патчей, созданными в Git 1.9 и более ранних версиях, и которые не работают с патчами в изменённом порядке, может понадобиться этот параметр.
Используется по умолчанию.
Примеры
git-cherry[1] показывает, какие коммиты из ветки имеют эквивалентные по идентификатору патча коммиты в некоторой вышестоящей ветке. Однако команда сообщает лишь о том, существует ли такой коммит. Что, если нужно узнать соответствующие коммиты в вышестоящей ветке? С помощью этой команды можно сопоставить вашу ветку с вышестоящей:
#!/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" Теперь в первом столбце отображается коммит из вашей ветки, а во втором — коммит с эквивалентным идентификатором патча, если он существует.
См. также
patch-id
© 2005–2026 Linus Torvalds and others
Licensed under the GNU General Public License version 2.
https://git-scm.com/docs/git-patch-id