Как захватить сообщение коммита git и запустить действие

Я новичок в git, и я хочу иметь возможность захватить сообщение фиксации после нажатия на источник/мастер и запустить сценарий bash (на сервере) на основе того, что содержит строка.

Например, если мое сообщение о коммите git говорит: [email] my commit message

Если сообщение фиксации содержит [email], выполните указанное действие, в противном случае не выполняйте его.

Вот пример скрипта bash, который я думаю использовать в хуке post-receive:

#!/bin/bash

MESSAGE= #commit message variable?

if [[ "$MESSAGE" == *[email]* ]]; then
        echo "do action here"
else
        echo "do nothing"
fi

В основном все, что мне нужно знать, это имя переменной для сообщения фиксации, чтобы использовать ее в приведенном выше сценарии bash? Кроме того, я не уверен, что это правильный крючок, чтобы сделать это или нет.


person James Nine    schedule 02.02.2011    source источник


Ответы (2)


Я думаю, что понял ответ на свой вопрос; переменную можно получить с помощью команды git-log:

git log -1 HEAD --pretty=format:%s

Итак, мой сценарий будет таким:

#!/bin/bash

MESSAGE=$(git log -1 HEAD --pretty=format:%s)

if [[ "$MESSAGE" == *\[email\]* ]]; then
        echo "do action here"
else
        echo "do nothing"
fi

Я надеюсь, что это может помочь любому, кто ищет ответ.

person James Nine    schedule 02.02.2011
comment
Значит, эта разметка [email] будет постоянной частью вашего сообщения о коммите? - person Cascabel; 02.02.2011
comment
Другие возможные методы: используйте переменную окружения для передачи сигнала хуку, чтобы в сообщении коммита об этом никогда ничего не было. Используйте псевдоним, чтобы сделать это проще. Или, если вы хотите написать это в сообщении, определите разметку в хуке перед фиксацией, чтобы вы могли изменить сообщение до того, как фиксация будет записана. (Либо предположим, что фиксация завершится успешно, и сразу же отправят электронное письмо, либо сохранят что-то для хука после фиксации, чтобы включить его...) - person Cascabel; 02.02.2011
comment
Или вы действительно делаете это после получения, а не после фиксации? Тогда вы, конечно, больше не сможете изменить сообщение коммита. Однако это означает, что ваше решение не работает: push не просто отправляет один коммит, он обновляет любое количество ссылок, каждое из которых может включать любое количество новых коммитов. Вы действительно должны посмотреть на пример в файле git contrib. Он обрабатывает довольно много, и вы можете изменить его, чтобы обращать внимание только на коммиты, которые говорят [email]. - person Cascabel; 02.02.2011
comment
И, наконец, если вы решите реализовать свой собственный, вам нужно будет прочитать информацию передается в ловушку на стандартном вводе (это то же самое, что и ловушка перед получением), а затем для каждой ссылки проверяется коммит от старого значения к новому значению и принимается соответствующее действие для каждого. - person Cascabel; 02.02.2011
comment
@James Nine, если у меня есть многострочное сообщение фиксации, ваше решение не будет работать, так как оно будет отображать только первую строку сообщения фиксации. git log -1 HEAD --pretty=format:%s Приведенная выше команда отобразит только первую строку сообщения фиксации. - person ; 07.02.2012

Вероятно, вам понадобится git hook для этого

person Pablo Fernandez    schedule 02.02.2011
comment
Я уже использую хук post-receive; какую переменную я использую в своем сценарии bash, или, что еще лучше, можете ли вы указать мне ссылку или пример, который может сказать мне, что использовать, чтобы я мог его проанализировать? - person James Nine; 02.02.2011
comment
Для вашего удобства я опубликую текст по ссылке, которую Пабло прислал вам сюда: После того, как весь процесс коммита завершен, запускается хук пост-коммита. Он не принимает никаких параметров, но вы можете легко получить последний коммит, запустив git log -1 HEAD. Как правило, этот скрипт используется для уведомления или чего-то подобного. - person Dustin; 02.02.2011
comment
Чтобы ответ был действительно полезным, он должен содержать как минимум достаточно приведенного выше комментария, чтобы разумно стоять самостоятельно. - person tripleee; 10.01.2017