Получить все заметки для коммита, включая их автора и коммиттера

Существует ли простой способ получить все заметки для определенного коммита, включая информацию об авторе заметок и коммитере заметок?

С помощью git show --notes=refs/notes/* <commit_hash> Я смог получить все записи. Однако я не выяснил, как получить автора и коммиттера заметки, используя сантехнические команды.

1 ответ

Решение

В то время как git notes на самом деле работает, фиксируя что-то, имя автора и / или коммиттера, прикрепленный к git notes Коммит не считается полезным и, следовательно, не доступен. Есть несколько веских причин для этого.

Давайте кратко рассмотрим репозиторий с заметками. Здесь я собираюсь использовать репозиторий freebsd на GitHub, так как refs/notes/commits (который по $ причинам я сопоставил с refs/notes/origin/commits). На данный момент имеем:

$ git rev-parse refs/notes/origin/commits
af51c6d65d574faa11ab8026398e045e5f584040
$ git show af51c6d65d574faa11ab8026398e045e5f584040 | sed 's/@/ /'
commit af51c6d65d574faa11ab8026398e045e5f584040
Author: hselasky <hselasky FreeBSD.org>
Date:   Mon Aug 14 12:59:14 2017 +0000

    Adding Git note for current refs/heads/stable/10

diff --git a/13/06/ece6bde0e4291eaf08139085990e5f55a622 b/13/06/ece6bde0e4291eaf08139085990e5f55a622
new file mode 100644
index 000000000000..3d1ba58d02fa
--- /dev/null
+++ b/13/06/ece6bde0e4291eaf08139085990e5f55a622
 @ -0,0 +1 @@
+svn path=/stable/10/; revision=322500

Посмотрите, что происходит в этом коммите: он добавляет файл с именем 13/06/ece6bde0e4291eaf08139085990e5f55a622, Этот файл содержит примечание для объекта, чей идентификатор 1306ece6bde0e4291eaf08139085990e5f55a622:

$ git show --decorate 1306ece6bde0e4291eaf08139085990e5f55a622 | sed 's/@/ /'
commit 1306ece6bde0e4291eaf08139085990e5f55a622 (origin/stable/10)
Author: hselasky <hselasky FreeBSD.org>
Date:   Mon Aug 14 12:59:14 2017 +0000

    MFC r314878:
    Add support for constant pointer constructs to READ_ONCE() in the
    LinuxKPI. When the type of the argument is constant the temporary
    variable cannot be assigned after the barrier. Instead assign the
    temporary variable by initialization.

    Approved by:            re (kib)
    Sponsored by:           Mellanox Technologies

Notes (origin/commits):
    svn path=/stable/10/; revision=322500

[diff snipped]

(У меня есть этот репозиторий, настроенный на использование refs/notes/origin/commits таким образом, заметка будет показана здесь.) В этом случае, что типично, автор и коммиттер самой заметки тот же, что и автор и коммитер коммита, к которому прикреплена заметка.

Если мы посмотрим ближе на объект af51c6d65d574faa11ab8026398e045e5f584040 Тем не менее, мы видим, что у него много файлов с такими странными именами:

$ git ls-tree af51c6d65d574faa11ab8026398e045e5f584040
040000 tree 598b9e08b0138536da55f5ef55868b2a3a607194    00
040000 tree 5101bb91ab93102057e242b41e19c55fdf3314e7    01
040000 tree 2105ada31d9191d03b50a7ad5c97471c0b531283    02
040000 tree 3e42537c937f0f36cff65b7b19570d2e301a17d2    03
[and so on for 256 names]

Если мы посмотрим на 598b9e08b0138536da55f5ef55868b2a3a607194 мы находим еще 253 поддеревья с именем 00, 01, 02.... Верхнее это:

$ git ls-tree 598b9e08b0138536da55f5ef55868b2a3a607194 | head -1
040000 tree 825029e67b3e99c8c9f36c68c26c57b7f4c2edb4    00

а также 825029e67b3e99c8c9f36c68c26c57b7f4c2edb4 Сам по себе имеет всего 7 записей:

$ git ls-tree 825029e67b3e99c8c9f36c68c26c57b7f4c2edb4
100644 blob 47efcb375199433eaff1932ab03ff51ffbc0f4b2    067319a197c517553b4bd00eeca22fbbb7bb
100644 blob a6aa47f5b27bc95afedb4178da68958d10c0665a    252549bd16445f7a9c45ff41b295a8bc653d
100644 blob b892978bc9120fe06997841b48e6cc05027234db    a5b6354a4d39247d26563c2cf96ea644af63
100644 blob b50a07b6e41e178bc374ab25e860a33560929801    b2ecb7b200786a0a17d90036510a2aa4fa86
100644 blob 5725ea47215dd0697cb4510c53b63c49f6285a1b    d86e693087beab26f4d49d7e3eb86a611efb
100644 blob 86754af5a4c9077db1e0bc52952823b3012278b4    e846eae3e7cb94a93496931c64d69682818f
100644 blob 8798a0048bf97bce373e24f0fb0456544c127406    fe19d1123431f6cbad809f708ab744b4d02c

Имена слева являются именами файлов: это файлы, хранящиеся в 00 поддерево 00 Дерево коммита. Таким образом, эта фиксация заметки "верхнего уровня", созданная hselasky, содержит сотни тысяч файлов (на данный момент 332 670), все имена которых являются этими фанки-хэш-идентификаторами, разделенными на каталоги каталогов, так что ни один подкаталог не имеет слишком много файлов.

Какие git show делает с реальным коммитом, таким как 1306ece6bde0e4291eaf08139085990e5f55a622 (текущий совет refs/heads/stable/10), чтобы посмотреть в коммит af51c6d65d574faa11ab8026398e045e5f584040 чтобы увидеть, есть ли у него файл с именем 1306ece6bde0e4291eaf08139085990e5f55a622 или чье имя каталога начинается с 13, Если он находит каталог, он проверяет в нем, есть ли файл, имя которого начинается с 06ece6bde0e4291eaf08139085990e5f55a622 или каталог, имя которого начинается с 06, Если он находит каталог, он снимает следующие два символа и так далее. В конце концов, он либо находит файл, либо нет.

Если Git находит файл, имя которого совпадает с хэшем коммита, тогда этот файл содержит примечания для этого коммита.

Если Git не находит такой файл, то для этого коммита нет примечания.

Теперь можно обновить заметку. Обновление заметки означает, что мы делаем новый коммит, содержимое которого совпадает с предыдущим коммитом, за исключением одного файла. Допустим, мы решили обновить заметку для коммита 1306ece6bde0e4291eaf08139085990e5f55a622, Мы находим, что это было положено в 13/06/ec... поэтому мы извлекаем заметки-коммит af51c6d6... в дерево, отредактируйте файл 13/06/ec..., измените примечание, напишите файл и напишите новый коммит, родительский коммит которого af51c6d6..., Мы заполняем новый хеш для этого нового коммита в refs/notes/origin/commits или же refs/notes/commits... и теперь мы заменили записку.

Замена заметки следующим образом - это один из способов получить другого автора и коммиттера для заметки, которая идет с оригинальной фиксацией. 1306ec...,

Но давайте посмотрим на более ранний коммит. Следующий коммит на stable/10 является 8f2e6e2e028ef61fd105967432ff2838153110f7, Мы находим его примечание, взглянув на обязательство, к которому refs/notes/origin/commits очки: это af51c6... снова. Есть ли у него каталог с именем 8f? Почему да, это так. Есть ли в этом каталоге подкаталог с именем 2e? Конечно же, это так. Есть ли у этого файл с именем 6e2e...?

$ git rev-parse refs/notes/origin/commits:8f/2e/6e2e028ef61fd105967432ff2838153110f7
46fa8873ffcf4c9e0d0270b02a3e2abcdf10e31e

На самом деле это так, и мы можем посмотреть на это:

$ git cat-file -p 46fa8873ffcf4c9e0d0270b02a3e2abcdf10e31e
svn path=/stable/10/; revision=322462

так что это записка для коммита 8f2e74c5..., Но автор и приверженец того места, куда мы смотрели refs/notes/origin/commits ака af51c6... - это hselasky, в то время как автор и исполнитель 8f2e6e2e028ef61fd105967432ff2838153110f7 это авос.

Чтобы найти автора и коммиттера того, кто совсем недавно изменил примечание для 8f2e6e2e028ef61fd105967432ff2838153110f7 надо начинать с верхнего уровня refs/notes/origin/commits зафиксируйте и посмотрите, кто коснулся файла, имя которого выглядит так. Само название на самом деле, в настоящее время, 8f/2e/6e2e...; но в какой-то более ранний момент название было бы 8f/2e6e2e... и, поскольку хранилище продолжает расти, имя в какой-то момент внезапно изменится на 8f/2e/6e/2e..., Таким образом, нам нужен инструмент, который не только осознает причудливую вещь hash-ID-as-file-name, но также знает, что разделение на каталоги, содержащие подкаталоги, содержащие файлы, развивается с течением времени. Это делает довольно трудным найти, когда примечание изменилось, если это когда-либо сделало.

Если примечание никогда не изменяется, то при первом добавлении в репозиторий обычно происходит "когда создается сам коммит", и поэтому его автор и коммиттер будут соответствовать автору и коммиттеру коммита. Так что это обычно достаточно хорошо. Если он недостаточно хорош для вашего случая использования, вам придется написать свои собственные инструменты.

Другие вопросы по тегам