Перехватчик Git для обновления сообщения фиксации данными из API

Я пытаюсь обновить коммит git, добавив подробные сведения из нашего API продажи билетов. Я хотел бы получить название номера билета, который разработчик добавляет в коммит git, и обновить коммит этим заголовком.

e.g.

git add /some/file

git commit -am "#[id]
Did some work
Other stuff I Did"

На этом этапе я хотел бы получить идентификатор, который они использовали, вызвать мой API в bash, а затем добавить к фиксации заголовок, чтобы в результате сообщение фиксации было на самом деле «# [id] Заголовок билета».

Мне интересно, какой крючок я могу использовать для этого. Я не ищу помощи в том, как написать хук, но больше того, какой хук git я бы использовал, и если мне нужно изменить фиксацию после того, как она была сделана (скажем, мне нужно сделать это при фиксации поста). Как бы выглядел git commit --amend?

заранее спасибо


person DMCApps    schedule 01.08.2018    source источник


Ответы (3)


Вы можете выбрать между prepare-commit-msg и commit-msg. Первый вызывается до того, как git commit откроет редактор для редактирования сообщения о фиксации, второй - после. Оба должны редактировать файл сообщения (путь к нему, переданный в качестве первого параметра) на месте. Первый вызывается всегда, второй можно обойти с помощью git commit --no-verify. Код ошибки при выходе прерывает фиксацию.

person phd    schedule 01.08.2018
comment
Я не верю, что могу использовать любой из них, поскольку мне нужно, чтобы пользователь ввел сообщение. Я хотел бы взять сообщение, проанализировать используемый идентификатор, а затем обновить сообщение данными, полученными из API, чтобы изменить сообщение. - person DMCApps; 02.08.2018
comment
В вашем случае prepare-commit-msg получите файл и литерал "message" в качестве параметров. Остальное зависит от тебя. - person phd; 02.08.2018

Это не решает напрямую вашу проблему, но, возможно, может помочь в реализации перечисленных выше предложений.

Я написал небольшой инструмент, помогающий управлять хуками git.

https://pypi.org/project/hooks4git/

person Lovato    schedule 06.08.2018

Как упоминалось, вы можете использовать git хуки для управления сообщением фиксации.

Я не верю, что могу использовать любой из них, поскольку мне нужно, чтобы пользователь ввел сообщение.

Хук commit-msg срабатывает после того, как пользователь записывает сообщение и выходит из редактора, но до совершения фиксации.

На githooks странице руководства:

commit-msg
    This hook is invoked by git-commit(1) and git-merge(1), and can be
    bypassed with the --no-verify option. It takes a single parameter, the
    name of the file that holds the proposed commit log message. Exiting
    with a non-zero status causes the command to abort.

    The hook is allowed to edit the message file in place, and can be used
    to normalize the message into some project standard format. It can also
    be used to refuse the commit after inspecting the message file.

    The default commit-msg hook, when enabled, detects duplicate
    "Signed-off-by" lines, and aborts the commit if one is found.

Итак, чтобы заменить заголовок сообщения, вы можете использовать что-то вроде этого:

#!/bin/sh

file="$1"
ticket_id="$(sed -E -ne '1s/^#([0-9]+)/\1/p' <"$file")"
ticket_title="$(call_my_api "ticket_id")"

sed -i.bak -e "1s/.*/#$ticket_id $ticket_title/" "$file"

Примечание: суффикс (например, .bak) необходим для переносимости.


Несмотря на то, что это работает, я бы не рекомендовал этого, или, когда вы просите обзор ветки, git log --oneline даст вам следующее:

#123 Foo is returning error 418
#123 Foo is returning error 418
#123 Foo is returning error 418
#123 Foo is returning error 418
#123 Foo is returning error 418

Это было бы особенно плохо для ветки с десятками коммитов, связанных с одним тикетом.

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

#!/bin/sh

file="$1"
ticket_id="$(sed -E -ne '1s/^#\[([0-9]+)\]/\1/p' <"$file")"
ticket_title="$(call_my_api "ticket_id")"

printf -- '\n%s\n' "$ticket_title" >>"$file"

Наша команда обычно использует часть заголовка заявки в теле сообщения фиксации, чтобы добавить контекст, и это работает достаточно хорошо.


Обновление: обнаружена аналогичная попытка (но вместо этого на основе имени ветки):

Как предоставить подготовленное сообщение коммита git?

person kelvin    schedule 05.08.2018