Могу ли я добавить метаданные в коммиты git? Или я могу скрыть некоторые теги в Gitk - PullRequest
38 голосов
/ 21 апреля 2010

Я хочу связать пользовательские метаданные с git commit. В частности, чтобы записать идентификатор обзора из обзора кода, но это может быть что угодно. Теги кажутся естественным способом сделать это, но я ожидаю, что у меня будет обзор для каждого коммита, и я не хочу загромождать gitk тоннами тегов. Есть ли какой-то другой механизм для добавления пользовательских метаданных? Могу ли я сделать определенные теги невидимыми? Если бы я мог сказать gitk не отображать теги, соответствующие некоторому шаблону или RE, это, вероятно, сработало бы, но я не вижу способа сделать это.

Ответы [ 2 ]

34 голосов
/ 21 апреля 2010

Это именно то, для чего git notes .

25 голосов
/ 09 ноября 2016

GIT-примечания

С помощью git notes вы можете добавить «примечание» к коммиту. Вы также можете добавить их для других объектов Git, но давайте просто сосредоточимся на коммитах, так как это то, что вопрос о.

Заметка является объектом Git и в принципе может быть «что угодно» (произвольно данные). Но мы сосредоточимся на чем-то простом и текстовом для наших целей.

Пример: идентификатор отзыва

В вопросе упоминаются идентификаторы обзора, поэтому давайте придумаем способ представить такая вещь Я не знаю, как на самом деле выглядят идентификаторы, но надеюсь, было бы целесообразно следующее:

Review-id: 42

Так что это фактически пара ключ-значение. Давайте добавим вышеупомянутую строку в текущий коммит:

git notes add -m "Review-id: 42"

Если вы запустите git log, примечание будет показано в строке: († 1)

Author: Victor Version Control <vvc@vcs.org>
Date:   Tue Nov 8 21:10:25 2016 +0100

    Implement feature x

Notes:
    Review-id: 42

Другой пример

Конечно, вы можете добавить больше «сносок» к этой заметке (мы будем придерживаться простой синтаксис key: value, одно значение в строке). Например, если вы три месяца спустя узнал, что сообщение коммита получило что-то неправильно, просто добавьте исправление к примечанию:

git notes append -m "Errata: It was actually feature y."

git log

Author: Victor Version Control <vvc@vcs.org>
Date:   Tue Nov 8 21:10:25 2016 +0100

    Implement feature x

Notes:
    Review-id: 42

    Errata: It was actually feature y.

Мы используем git notes append, чтобы легко добавить эти дополнительные данные в нота. Вы также можете использовать git notes edit для редактирования файла непосредственно.

Конечно, поскольку заметка Git - это всего лишь один изменяемый файл, вы можете запустить в конфликты слияния. Чтобы сделать это менее вероятным, вы можете:

  1. Придерживайтесь простых данных, как указано выше (одно значение ключа на строку).
  2. Использовать специальные стратегии слияния; см man git-notes, раздел «Примечания стратегии слияния ».

Видимость

ОП спросил:

> Могу ли я сделать определенные теги невидимыми?

По умолчанию git log показывает только одну заметку, а именно .git/refs/notes/commits. commits - это только одна заметка в пространстве имен. Возможно, вы хотите, чтобы эмитент находился в собственном пространстве имен:

git notes --ref=issues add -m "Fixes: #32"

Так как это хранится в .git/refs/notes/issues, а не в .git/refs/notes/commits, «Исправления: # 32» не будет отображаться при запуске git log. Таким образом, вы по умолчанию сделали такие заметки невидимыми.

Если вы хотите, чтобы это было показано, передайте --notes=issues на git log:

$ git log --notes=issues
Author: Victor Version Control <vvc@vcs.org>
Date:   Tue Nov 8 21:10:25 2016 +0100

    Implement feature x

Notes (issues):
    Fixes: #32

Но теперь .git/refs/notes/commits скрыты. Это легко может быть также включено:

$ git log --notes=issues --notes=commits
Author: Victor Version Control <vvc@vcs.org>
Date:   Tue Nov 8 21:10:25 2016 +0100

    Implement feature x

Notes (issues):
    Fixes: #32

Notes:
    Review-id: 42

    Errata: It was actually feature y.

Существуют переменные для настройки того, какие заметки показываются по умолчанию; увидеть man git-config.

Преимущества по сравнению с сообщениями о фиксации

Метаданные, конечно, могут быть записаны непосредственно в сообщении фиксации. († 2) Но сообщения коммита являются неизменяемыми, поэтому их изменение действительно означает создание совершенно новый коммит со всеми вытекающими отсюда последствиями. Git-заметки с другой стороны изменчивы, поэтому вы всегда можете пересмотреть их. И каждая модификация заметки, конечно, версия контролируется. В нашем случае для .git/refs/notes/commits:

$ git log refs/notes/commits
Author: Victor Version Control <vvc@vcs.org>
commit 9f0697c6bbbc6a97ecce9834d4c9afa0d668bcad
Date:   Tue Nov 8 21:13:52 2016 +0100

    Notes added by 'git notes append'

commit b60997e49444732ed2defc8a6ca88e9e21001a1d
Author: Victor Version Control <vvc@vcs.org>
Date:   Tue Nov 8 21:10:38 2016 +0100

    Notes added by 'git notes add'

Обмен заметками

Ваши заметки по умолчанию не публикуются; Вы должны сделать это явно. А также По сравнению с другими ссылками, обмен заметками не очень удобен для пользователя. У нас есть использовать синтаксис refspec :

git push refs/notes/*

Вышеприведенные сообщения перенесут все ваши заметки на ваш пульт.

Кажется, что извлечение заметок немного сложнее; Вы можете сделать это, если Вы указываете обе стороны refspec:

git fetch origin refs/notes/*:refs/notes/*

Так что это определенно не удобно. Если вы собираетесь использовать Git-notes регулярно вы, вероятно, захотите настроить свой gitconfig так, чтобы он всегда получал Примечания:

[remote "origin"]
    …
    fetch = +refs/notes/*:refs/notes/*

(Источник: https://git -scm.com / blog / 2010/08/25 / notes.html )

Перенос заметок при перезаписи

Git имеет неудобное значение по умолчанию, что заметки не переносятся при фиксации переписан Так что если вы, например, перебазируете серию коммитов, заметки будут не переносить на новые коммиты.

Переменная notes.rewrite.<command> по умолчанию установлена ​​на true, так что можно Предположим, что примечания переносятся . Но проблема в том, что переменная notes.rewriteRef, который определяет , какие ноты будут перенесены, не имеет глухой vaule. Чтобы установить это значение, чтобы соответствоватьВсе замечания, выполните следующее:

git config --global notes.rewriteRef "refs/notes/*"

Теперь все заметки будут перенесены при выполнении операций перезаписи, таких как git rebase.

Перенос заметок через почтовые патчи

Если вы используете git format-patch для форматирования ваших изменений, которые будут отправлены как электронные письма, и у вас есть некоторые метаданные, хранящиеся в виде заметок Git, вы можете передать --notes опция git format-patch для добавления примечаний к черновику электронного письма.


† 1: «Это значение по умолчанию для git log […], когда нет --pretty, Параметр --format или --oneline задан в командной строке. ”- man git-log, версия git 2.10.2

† 2: одна практика / соглашение для метаданных в сообщениях коммита, которая используется в таких проектах, как, например, Git и ядро ​​Linux - это добавление пар ключ-значение в «трейлер» сообщения фиксации, то есть внизу. См. Например этот коммит Линуса Торвальдса:

 mm: remove gup_flags FOLL_WRITE games from __get_user_pages()
 This is an ancient bug that was actually attempted to be fixed once
 (badly) by me eleven years ago in commit 4ceb5db9757a ("Fix
 get_user_pages() race for write access") but that was then undone due to
 problems on s390 by commit f33ea7f404e5 ("fix get_user_pages bug").

 In the meantime, the s390 situation has long been fixed, and we can now
 fix it by checking the pte_dirty() bit properly (and do it better).  The
 s390 dirty bit was implemented in abf09bed3cce ("s390/mm: implement
 software dirty bits") which made it into v3.9.  Earlier kernels will
 have to look at the page state itself.

 Also, the VM has become more scalable, and what used a purely
 theoretical race back then has become easier to trigger.

 To fix it, we introduce a new internal FOLL_COW flag to mark the "yes,
 we already did a COW" rather than play racy games with FOLL_WRITE that
 is very fundamental, and then use the pte dirty flag to validate that
 the FOLL_COW flag is still valid.

 Reported-and-tested-by: Phil "not Paul" Oester <kernel@linuxace.com>
 Acked-by: Hugh Dickins <hughd@google.com>
 Reviewed-by: Michal Hocko <mhocko@suse.com>
 Cc: Andy Lutomirski <luto@kernel.org>
 Cc: Kees Cook <keescook@chromium.org>
 Cc: Oleg Nesterov <oleg@redhat.com>
 Cc: Willy Tarreau <w@1wt.eu>
 Cc: Nick Piggin <npiggin@gmail.com>
 Cc: Greg Thelen <gthelen@google.com>
 Cc: stable@vger.kernel.org
 Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

См:

  • man git-interpret-trailers
  • Это вики-страница ядра , в которой перечислены различные строки трейлера (обычно пары ключ-значение), которые используются в различных проектах.
...