Иногда важно помнить о том, что вместе с апдейтом кода появилась и новая миграция, которую нужно бы не забыть запустить. Первый вариант — git merge-base и еще несколько полезных команд. Задачу это решает, но требует множества действий — есть простор для фантазии и автоматизации. Пускай git сам напоминает нам о новых миграциях!
#!/bin/bash
HAS_NEW_MIGRATIONS=0
git diff HEAD@{1} HEAD@{0} --name-only --diff-filter=A | grep 'migration' | while read FILENAME; do
if [ "$HAS_NEW_MIGRATIONS" == 0 ] ; then
echo -en "\033[32mМиграции добавлены: \033[0m \n"
HAS_NEW_MIGRATIONS=1
fi
echo -en "\033[32m — " $FILENAME "\033[0m \n"
done
HAS_MODIFIED_MIGRATIONS=0
git diff HEAD@{1} HEAD@{0} --name-only --diff-filter=M | grep 'migration' | while read FILENAME; do
if [ "$HAS_MODIFIED_MIGRATIONS" == 0 ] ; then
echo -en "\033[31mМиграции изменены: \033[0m \n"
HAS_MODIFIED_MIGRATIONS=1
fi
echo -en "\033[31m — " $FILENAME "\033[0m \n"
done
exit 0
~/project/.git/hooks/post-checkout
~/project/.git/hooks/post-merge
~/project/.git/hooks/post-rewrite
Миссия выполнена. Теперь при обновлении мы будем получать зеленый список новых миграций и красный список измененных миграций (но лучше такого вовсе не допускать). Не забудьте поставить файлу права на выполнение.
На самом деле, лучше используйте какое-нибудь готовое решение для учета миграций, которое, в том числе, умеет их откатывать. А еще лучше — делайте это автоматически, используя Continious Delivery.