git post-receive, перехватывает фиксацию сообщений и сообщений обратно на URL - PullRequest
8 голосов
/ 25 ноября 2011

Мы используем систему тикетов, которую я хочу автоматически обновлять, когда разработчики отправляют свои изменения на сервер.Чтобы обновить его, мне нужно только указать определенный URL с сообщением фиксации в качестве переменной GET.Вызываемая страница зарегистрирует это изменение.Я знаю, что мой путь - использовать hooks , но я не знаком ни с Bash, ни с Perl, так что это довольно сложно.

Я хочу добиться этого:

  • Разработчик НАЖИМАЕТ на сервер
  • post-receive Хук запускает и проверяет, какие новые коммиты являются новыми (потому что может быть несколькоодним нажатием)
  • Он проходит через них, и для каждого коммита он открывает URL с сообщением о коммите (curl http://server.com/logthis.asp?msg=Here_goes_the_commit_message, что-то в этом роде)

Вот и все.Хотя я проверил несколько образцов , связанных с такой идеей, ни один из них не делает именно этого.Как это можно сделать?

1 Ответ

9 голосов
/ 25 ноября 2011

Основная PITA - выделить правильный список новых ревизий, который я позаимствовал из /usr/share/doc/git/contrib/hooks/post-receive-email(show_new_revisions).

while read oval nval ref ; do
    if expr "$ref" : "^refs/heads/"; then
        if expr "$oval" : '0*$' >/dev/null
        then
            revspec=$nval
        else
            revspec=$oval..$nval
        fi
        other_branches=$(git for-each-ref --format='%(refname)' refs/heads/ |
            grep -F -v $ref)

        # You may want to collect the revisions to sort out
        # duplicates before the transmission to the bugtracker,
        # but not sorting is easier ;-)
        for revision in `git rev-parse --not $other_branches | git rev-list --stdin $revspec`; do
                    # I don't know if you need to url-escape the content
                    # Also you may want to transmit the data in a POST request,
            wget "http://server.com/logthis.asp?msg=$(git log $revision~1..$revision)"
        done
    fi
done
...