Не удалось обнаружить ответвление от перехвата Git после получения

#git #hook #git-post-receive

#git #перехват #git-post-receive

Вопрос:

У меня есть настройка перехвата после получения в удаленном репозитории, которая пытается определить название ветки входящего push следующим образом:

 $branch = `git rev-parse --abbrev-ref HEAD`
  

Однако я нахожу, что независимо от того, какую ветку я отправляю из моей переменной $ branch, устанавливается значение ‘master’.

Есть идеи?

Ответ №1:

Перехват после получения получает те же данные, что и предварительный прием, но не в качестве аргументов, а из stdin. Для всех ссылок отправляется следующее:

Старое имя ссылки (пробел) Новое имя ссылки (перевод строки)

Вы могли бы разобрать имя ссылки с помощью этого скрипта bash:

 while read oldrev newrev ref
do
    echo "$ref"
done
  

Комментарии:

1.за исключением того, что будьте осторожны, если, например, post-receive получает git push --tags (и, вероятно git push origin my_tagname ), то ref вы получите refs/tags/my_tagname , а не refs/branch/my_branchname

2. Как я могу переключиться на предыдущую фиксацию в перехвате после получения ?

Ответ №2:

Вы также могли бы сделать что-то подобное, используя замену переменной bash:

 read oldrev newrev ref

branchname=${ref#refs/heads/}

git checkout ${branchname}
  

Комментарии:

1. Идеально, а затем объедините с циклом @ralphtheninja, чтобы прочитать все при отправке нескольких ответвлений

Ответ №3:

Решение Магнуса не сработало для меня, но это сработало:

 #!/bin/bash

echo "determining branch"

if ! [ -t 0 ]; then
  read -a ref
fi

IFS='/' read -ra REF <<< "${ref[2]}"
branch="${REF[2]}"

if [ "master" == "$branch" ]; then
  echo 'master was pushed'
fi

if [ "staging" == "$branch" ]; then
  echo 'staging was pushed'
fi

echo "done"
  

Комментарии:

1. Это потому, что вы ищете слово master, но то, что вы получили, было refs / head / master. Используя read, вы превратили строку в массив, разделенный символом ‘/’. Затем вы извлекли значение.

2. Привет, можете ли вы помочь о том, как добавить and условие в if like if ["master" == "$branch" amp;amp; "development"=="$branch"] . Как использовать и условие в этом, если в перехвате. Заранее благодарю.

Ответ №4:

Оба эти ответа верны, но у меня возникли проблемы с получением stdin для следующей общей функции post-receive-email. Вот что у меня получилось:

 read oldrev newrev ref
echo "$oldrev" "$newrev" "$ref" | . /usr/share/git-core/contrib/hooks/post-receive-email


if [ "refs/heads/qa" == "$ref" ]; then
  # Big Tuna YO!
  wget -q -O - --connect-timeout=2 http://127.0.0.1:3000/hooks/build/qa_now
fi
  

Ответ №5:

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