Coder Social home page Coder Social logo

git-migration-hook's Introduction

git-migration-hook

We all love git and the easy ways it allows us to create, switch and merge branches. However, when you have a project, say a website, which uses a database it's hard to migrate the database schema with your project code (i.e. PHP code).

Consider the following scenario. You have two branches:

  • master - which contains the website that's currently online
  • feature - which contains an unfinished new feature

For the new feature to work properly, it needs to change the database schema. The workflow is as follows:

  1. When, in you feature branch, you change your code which needs a change of the database schema, you also commit two new SQL files in the migrations directory, say:
    • 20151120130200-extra-field-up.sql (containing all the SQL queries to migrate upwards)
    • 20151120130200-extra-field-down.sql (containg all the SQL queries to migrate downwards)
  2. When you now perform a checkout to master, the post-receive git hook will:
    1. find all *-down.sql scripts in the commits from <new HEAD>..<old HEAD>
    2. execute those scripts with the local database
    3. find all *-up.sql scripts in the commits from <old HEAD>..<new HEAD>
    4. execute those scripts with the local database
  3. When you merge your feature branch into master, the post-merge hook will:
    1. find all *-up.sql scripts in the commits from master..feature
    2. execute those scripts with the local database

Install

Simply copy the post-checkout and/or post-merge file to the .git/hooks directory of your own git repository. You can edit the config section of those files. See the files themselves for an explanation.

Usage

The naming of the migration SQL files is crucial. They should end with up.sql or down.sql. The rest of the name is completely up to you. However if you have a single commit with multiple up-migrations and/or multiple down-migrations the order in which they are performed depends on the lexicographical order. Migration files that are within different commits, will always be called in the same (reverse) order as the commits.

It's not a requirement that you have both an up-migration and a down-upgrade, nor is it a requirement that up- and down-migrations are named similar.

Warning

Although most data will remain intact when migrating from one branch to another, some data might get lost. If your feature branch has an extra table or field, then the complete table or field (including the data you have inserted in it) will get lost if you checkout a branch which does not have that table/field. No backup will be made.

A git reset will change the HEAD without invoking any hook. Unfortunately there does not exist any git hook that can be used, so this project cannot migrate the database when you perform a git reset.

pre-rebase is not implemented yet, so the database will not migrate when you perform a git rebase.

git-migration-hook's People

Contributors

richardbrinkman avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

Forkers

pascalbokbok

git-migration-hook's Issues

git tree contains more than just the changed files

git cat-file commit SHA1 gives you the tree of the complete tree, not the tree of committed and changed files. You have to figure out a different way to get to the file objects of a particular commit.

license

Hi Richard,
Would you consider changing or dual license git-migration-hook to a less strict license such as MIT or BSD?
I think that if I distribute my code with a gpl licensed git-migration-hook my code will fall under the GPL also.

Multiple versions of the same migration file executed on merge / checkout

First of all, thank you for this hook, we are starting to use it and it seems really promising!

We have found that if we commit multiple versions of the same sql migration file, every version of it is send to the OUTPUT script. Could it be possible to send only the last committed (current) version of the sql file?

The same happens for committed files that are later removed by another commit, they are executed too even if they are not in the current state of the repo.

Thank you.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.