#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
likeif ["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:
Вам нужно прочитать аргументы, которые передаются скрипту. У этого должно быть название ветки и новые и старые ревизии, и оно должно выполняться для каждой запущенной ветки