Я использую Git для управления исходным кодом и развертыванием моего веб-сайта, и в настоящее время тестовые и живые сайты работают на одном компьютере. Следуя этому ресурсу http://toroid.org/ams/git-website-howto, первоначально я разработал следующий сценарий перехвата после получения, чтобы различать нажатия на мой действующий сайт и нажатия на мой тестовый сайт:
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 для управления веб-сайтами?
В качестве дополнительного примечания в свете ответа Ви, есть ли хороший способ сделать это, который бы обрабатывал удаления без значительного вмешательства в файловую систему?
Спасибо,
-Walt
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 (это «голые» репозитории с рабочими деревьями, добавленными после init) имеет базовый пост-приём:
git checkout -f
if [ $? -eq 0 ]; then
echo "Live site `basename \`pwd\`` checked out successfully"
else
echo "Live site failed to checkout"
fi