Я использую Git для управления исходным кодом и развертыванием своего веб-сайта, и в настоящее время тестовый и действующий сайты работают на одном компьютере. После этого ресурса http://toroid.org/ams/git-website-howto Изначально я придумал следующий скрипт перехвата post-receive, чтобы различать отправку на мой рабочий сайт и отправку на мой тестовый сайт:
while read ref
do
#echo "Ref updated:"
#echo $ref -- would print something like example at top of file
result=`echo $ref | gawk -F' ' '{ print $3 }'`
if [ $result != "" ]; then
echo "Branch found: "
echo $result
case $result in
refs/heads/master )
git --work-tree=c:/temp/BLAH checkout -f master
echo "Updated master"
;;
refs/heads/testbranch )
git --work-tree=c:/temp/BLAH2 checkout -f testbranch
echo "Updated testbranch"
;;
* )
echo "No update known for $result"
;;
esac
fi
done
echo "Post-receive updates complete"
Однако я сомневаюсь, что это на самом деле безопасно :) Я ни в коем случае не эксперт по Git, но я предполагаю, что Git, вероятно, отслеживает текущую извлеченную ветку, и этот подход, вероятно, может запутать ее. до бесконечности.
Итак, несколько вопросов:
Это безопасно?
Было бы лучше, если бы мой базовый репозиторий был репозиторием тестового сайта (с соответствующим рабочим каталогом), а затем этот репозиторий отправлял изменения в новый репозиторий действующего сайта, у которого есть соответствующий рабочий каталог для базы действующего сайта? Это также позволило бы мне перенести производство на другой сервер и сохранить цепочку развертывания нетронутой.
Что-то мне не хватает? Есть ли другой чистый способ различать тестовое и производственное развертывание при использовании Git для управления веб-сайтами?
В качестве дополнительного примечания в свете ответа Ви: есть ли хороший способ сделать это, который обрабатывал бы удаление без особого вмешательства в файловую систему?
Спасибо, -Уолт
PS - Сценарий, который я придумал для нескольких репозиториев (и использую, если я не слышу лучше), выглядит следующим образом:
sitename=`basename \`pwd\``
while read ref
do
#echo "Ref updated:"
#echo $ref -- would print something like example at top of file
result=`echo $ref | gawk -F' ' '{ print $3 }'`
if [ $result != "" ]; then
echo "Branch found: "
echo $result
case $result in
refs/heads/master )
git checkout -q -f master
if [ $? -eq 0 ]; then
echo "Test Site checked out properly"
else
echo "Failed to checkout test site!"
fi
;;
refs/heads/live-site )
git push -q ../Live/$sitename live-site:master
if [ $? -eq 0 ]; then
echo "Live Site received updates properly"
else
echo "Failed to push updates to Live Site"
fi
;;
* )
echo "No update known for $result"
;;
esac
fi
done
echo "Post-receive updates complete"
И тогда репо в ../Live/$sitename (это "голые" репозитории с рабочими деревьями, добавленными после инициализации) имеет базовый пост-прием:
git checkout -f
if [ $? -eq 0 ]; then
echo "Live site `basename \`pwd\`` checked out successfully"
else
echo "Live site failed to checkout"
fi