Могу ли я добавить метаданные в Git commits? Или я могу скрыть некоторые теги в gitk

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

2 ответов


именно это git notes для.


ГИТ-Примечания

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

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

пример: review id

в вопросе упоминаются идентификаторы обзора, поэтому давайте придумаем какой-то способ представлять собой такая вещь. Я не знаю, как на самом деле выглядят идентификаторы обзора, но будем надеяться, что разумным окажется следующее:--46-->

Review-id: 42

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

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

если вы запустите git log Примечание будет показано inline†:

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. Таким образом, вы эффективно сделали такие заметки невидимыми по умолчанию.

если вы хотите, чтобы он был показан, pass --notes=issues to 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.

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

метаданные, конечно, могут быть записаны в сообщении фиксации напрямую. Но сообщения фиксации неизменяемы, поэтому изменить их действительно означает сделать совершенно новое обязательство со всеми вытекающими отсюда последствиями. 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-ноты регулярно вы, вероятно, захотите настроить gitconfig, чтобы всегда получать Примечания:

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

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

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

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

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

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

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

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

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


† " это значение по умолчанию для git log [...] когда нет --pretty, --format или --oneline опция, заданная в командной строке."― man git-log, версия git 2.10.2