Git::Release
============
(Working in progress, alpha stage)

Git::Release provides many useful features 
to reduce your release process efforts.

it defines many tasks for release process and 
which are generalized, easy to use.

# The Release Process

## The main branches

* master
* develop

### Master Branch

The master branch at origin should be familiar to every Git user. Parallel to
the master branch.

We consider origin/master to be the main branch where the source code of HEAD
always reflects a production-ready state.

### Develop Branch

We consider origin/develop to be the main branch where the source code of HEAD
always reflects a state with the latest delivered development changes for the
next release. Some would call this the “integration branch”. This is where
any automatic nightly builds are built from.

### Feature Branch

A feature branch may branch off from `develop` branch,

Once the feature branch is finished, the branch 
should be renamed with ready/ prefix first, 
which means this branch is ready to be released.

it should be merged back to a release branch later
if the feature branch is schuduled to be released. 

By using ready/ prefix, you can easily distinguish 
what branch is going to be released, what
branch should be waiting the next release.

To create a feature branch from current branch:

    $ git feature [feature name]

To create a feature branch from a branch:

    $ git feature [feature name] [your branch]

This will create a feature branch with prefix `feature/`, you can configure the prefix in your `.gitconfig` file.

A branch named like `feature/ajax` will be created.

To list feature branches:

    $ git feature --list

### Branch document

To show the document of a branch:

    $ git branch-doc


### Hotfix Branch

May branch off from `master`,

Must merge back to `develop` and `master`.

To create a hotfix branch from master:

    $ git hotfix [hotfix name]

This is not recommended, but you can still create a hotfix branch from a specified branch, 
if your production branch is not named master,

    $ git hotfix [hotfix name] your_branch

To list hotfix branches:

    $ git hotfix --list

### Release Ready Branch

When your feature branch or hotfix branch are ready to go, move into ready/ directory,
and the branch will be merged into current release branch for testing.

To move current branch to ready/:

    $ git ready

To move specified branch to ready/:

    $ git ready [branch name]

For example, to setup hotfix-3011 branch to ready.

    $ git ready hotfix/bug3011
    > ready/hotfix/bug3011

Steps are followed below:

* Trigger unit tests, selenium tests, continue to next step if it passed.
* Prune remote branches.
* Rename branch prefix to ready/

### Release Candidate Branch

A release candidate branch may branch off from `develop`, 
and must merge back into: `develop` & `master`.

Branch naming convention: `rc` or `rc-{version name}`

To create a release candiate branch:

    $ git rc

Steps are followed below:

* checkout rc branch
* find release ready branches (with ready/ prefix)
* merge ready branches one by one, and do testing after each merge.

Once your release branch is ready, you can run release.

    $ git release 
    
(Not implemented yet)

The release steps are followed below,

* Rename current ready/ branches with released prefix.
* Merge current release branch into master.
* Delete current release branch.
* Tag a release version on master.
* Rebase master branch onto `develop` branch.

### Site Branch

Each different site depends on a different released framework version,
So a site branch is branched off from a released framework version.

Custom Features might be developed on it, some of them can be merged back into
the next release branch.

# Setup

To install Git::Release process flow helper scripts.

    git release-init

# Configuration

to customzie your git-release config, edit your .gitconfig:
    
    [release]
        develop-branch = development
        production-branch = master
        production-branch = production
        release-branch-prefix = release
        feature-branch-prefix = feature
        hotfix-branch-prefix  = hotfix
        site-branch-prefix    = site

# Reference

http://nvie.com/posts/a-successful-git-branching-model/

http://reinh.com/blog/2009/03/02/a-git-workflow-for-agile-teams.html


# Todo

* redmine ticket integration.
* config integration.

(Comments are welcome)