Git: пустые аргументы в post-receive hook
Я пишу post-receive hook на основе post-receive-email
script из contrib
dir, но кажется, что аргументы oldrev
и newrev
пусты.
script выглядит следующим образом:
#!/bin/bash
oldrev=$(git rev-parse $1)
newrev=$(git rev-parse $2)
script работает при нажатии, но все $1
, $2
, $oldrev
и $newrev
пусты. Должен ли я настроить что-то, чтобы запустить его?
(Репозиторий был создан gitolite
, если это имеет значение)
Ответы
Ответ 1
Крючок post-receive
не принимает никаких аргументов. Quoth руководство (выделено мной):
Этот крючок вызывается git -receive-pack в удаленном репозитории, что происходит, когда в локальном репозитории выполняется git push. Он выполняется в удаленном репозитории один раз после обновления всех ссылок.
Этот крючок выполняется один раз для операции приема. Он не принимает аргументов, но получает ту же информацию, что и hook pre-receive
на своем стандартном входе.
Этот хук не влияет на результат git-receive-pack
, так как он вызывается после выполнения реальной работы.
Это заменяет крюк post-update
тем, что он добавляет как старые, так и новые значения всех ссылок в дополнение к их именам.
Как стандартный вывод, так и стандартный вывод ошибки отправляются на git send-pack
на другом конце, поэтому вы можете просто эхо-сообщения для пользователя.
Крючок post-receive
по умолчанию пуст, но есть образец script post-receive-email
, указанный в каталоге contrib/hooks
в дистрибутиве git, который реализует отправку писем с фиксацией.
Ответ 2
Я столкнулся с этой проблемой при настройке сервера непрерывной интеграции. Поскольку аргументы не передаются после приема через командную строку, вам необходимо использовать команду чтения. Вот как я это сделал:
#!/bin/sh
read oldrev newrev refname
BRANCH=${refname#refs/heads/}
curl --request POST "http://my.ci.server/hooks/build/myproject_$BRANCH"
Ответ 3
Нет аргументов, хотя информация передается через STDIN. Чтобы прочитать эту информацию из bash, просто выполните следующее:
read oldrev newrev refname
echo "Old revision: $oldrev"
echo "New revision: $newrev"
echo "Reference name: $refname"
Я просто подытоживаю уже опубликованные ответы.
Ответ 4
Более разработанная версия François script будет
#!/bin/bash
JENKINS_URL="http://192.168.1.116/jenkins"
GIT_URL="[email protected]:nuclos/nuclos.git"
# remove all spaces and newlines from ARG
trim() {
local ARG="$1"
shift
echo -e "$ARG" | tr -d "[:space:]\n"
}
# unique sort ARG items separated by newlines
unique() {
local ARG="$1"
shift
echo -e "$ARG" | sort -u -i
}
# cut first and last character from ARG
cutfl() {
local ARG="$1"
shift
local LEN="${#ARG}"
let LEN="$LEN - 2"
echo "${ARG:1:$LEN}"
}
BRANCHES=""
while read oldrev newrev refname; do
BRANCH=`trim ${refname#refs/heads/}`
if [ -n "$BRANCH" ]; then
BRANCHES+="${BRANCH}\n"
fi
done
BRANCHES=`unique "$BRANCHES" | tr '\n' ','`
BRANCHES=`cutfl "$BRANCHES"`
echo wget -q -O - "$JENKINS_URL/git/notifyCommit?url=$GIT_URL&branches=$BRANCHES"
at "now + 5 minutes" <<END
wget -q -O - "$JENKINS_URL/git/notifyCommit?url=$GIT_URL&branches=$BRANCHES"
END
Эта версия может справиться с несколькими ветвями и только запускает одну сборку для каждого из них.
Ответ 5
На самом деле, я не принимаю "не принимает никаких аргументов", потому что образец script post-receive.sample имеет следующий комментарий:
# The "post-receive" script is run after receive-pack has accepted a pack
# and the repository has been updated. It is passed arguments in through
# stdin in the form
# <oldrev> <newrev> <refname>
# For example:
# aa453216d1b3e49e7f6f98441fa56946ddcd6a20 68f7abf4e6f922807889f52bc043ecd31b79f814 refs/heads/master