Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Post checkout hook for managing rails migrations and bundle install
CHECKING_OUT_BRANCH=$3
OLD_BRANCH=$1
NEW_BRANCH=$2
if [ $CHECKING_OUT_BRANCH -eq 1 ]
then
FILES_CHANGED=`git diff $OLD_BRANCH $NEW_BRANCH --name-status`
MIGRATIONS_REMOVED=`echo "$FILES_CHANGED" | egrep 'D\tdb/migrate/([0-9]+)' | sort -r`
MIGRATIONS_ADDED=`echo "$FILES_CHANGED" | egrep 'A\tdb/migrate/([0-9]+)'`
# CHECK IF WE NEED TO DO A BUNDLE
BUNDLE_CHANGED=`echo "$FILES_CHANGED" | egrep 'M\tGemfile.lock'`
if [ ! -z "$BUNDLE_CHANGED" ]; then
echo "Your Gemfile.lock has changed, running bundle"
bundle
fi
if [ ! -z "$MIGRATIONS_REMOVED" ]; then
echo "Rolling back missing migrations"
for migration in $MIGRATIONS_REMOVED
do
if [ $migration == "D" ]; then
continue
fi
git checkout "$OLD_BRANCH" -- "$migration"
VERSION=`echo "$migration" | cut -d'_' -f1 | cut -d'/' -f3`
bundle exec rake db:migrate:down VERSION="$VERSION"
git reset
rm "$migration"
done
bundle exec rake db:test:prepare
git checkout db/schema.rb
fi
if [ ! -z "$MIGRATIONS_ADDED" ]; then
echo "New migrations have been added running migrations"
bundle exec rake db:migrate db:test:prepare
fi
fi
Copy link

ghost commented Apr 4, 2014

Loading

@brysgo
Copy link
Author

brysgo commented Apr 4, 2014

Add this to .git/hooks/post-checkout and it will manage your migrations as you use git normally

Loading

@jonlemmon
Copy link

jonlemmon commented Apr 6, 2014

Awesome!

Loading

@brysgo
Copy link
Author

brysgo commented Apr 8, 2014

Thanks!

Loading

@brysgo
Copy link
Author

brysgo commented Apr 10, 2014

This grew out of a gist, it now lives at brysgo/git-rails

Loading

@fikriauliya
Copy link

fikriauliya commented May 12, 2015

Small note for readers:

After copying to .git/hooks/post-checkout, run
chmod u+x .git/hooks/post-checkout
to make it executable

Loading

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment