git: пустые аргументы в обработчике post-receive - PullRequest
14 голосов
/ 21 сентября 2010

Я пишу хук после получения на основе сценария post-receive-email из каталога contrib, но кажется, что аргументы oldrev и newrev пусты

Сценарий выглядит так:

#!/bin/bash

oldrev=$(git rev-parse $1)
newrev=$(git rev-parse $2)

Сценарий запускается при нажатии, но все $1, $2, $oldrev и $newrev пусты. Должен ли я что-то настроить для запуска?

(хранилище было создано gitolite, если это имеет значение)

Ответы [ 5 ]

51 голосов
/ 26 января 2011

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

#!/bin/sh
read oldrev newrev refname
BRANCH=${refname#refs/heads/} 
curl --request POST "http://my.ci.server/hooks/build/myproject_$BRANCH"
11 голосов
/ 12 ноября 2012

Нет аргументов, хотя информация передается через STDIN.Чтобы прочитать эту информацию из bash, просто сделайте следующее:

read oldrev newrev refname
echo "Old revision: $oldrev"
echo "New revision: $newrev"
echo "Reference name: $refname"

Я просто суммирую ответы, которые уже опубликованы.

10 голосов
/ 21 сентября 2010

Хук post-receive не принимает аргументов.Quoth инструкция (выделение добавлено):

Этот хук вызывается git-receive-pack в удаленном репозитории, что происходит, когда git push выполняется в локальном репозитории.,Он выполняется в удаленном хранилище один раз после обновления всех ссылок.

Этот хук выполняется один раз для операции приема. Он не принимает аргументов , но получает ту же информацию, что и хук pre-receive на своем стандартном входе.

Этот хук не влияет на результат git-receive-pack, так как он называетсяпосле того, как реальная работа сделана.

Это заменяет хук post-update, поскольку он получает как старые, так и новые значения всех ссылок в дополнение к их именам.

И стандартный вывод, и стандартныйвывод ошибок передается в git send-pack на другом конце, так что вы можете просто выводить эхо-сообщения для пользователя.

Перехват post-receive по умолчанию пуст, но в сценарии предусмотрен пример сценария post-receive-email.contrib/hooks каталог в дистрибутиве git, который реализует отправку сообщений о коммитах.

3 голосов
/ 08 марта 2013

Более сложной версией сценария Франсуа будет

#!/bin/bash

JENKINS_URL="http://192.168.1.116/jenkins"
GIT_URL="git@bitbucket.org: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

. Эта версия может работать более чем с одной веткой и запускать только одну сборку для каждой.

1 голос
/ 07 февраля 2011

На самом деле, я не принимаю «он не требует аргументов», потому что пример сценария 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
...