Github: Mirroring gh-pages to master

I'm developing a jQuery plugin that's being hosting on GitHub. It has a demo included of which I'm manually copying and pushing to the branch gh-pages, what I'd like to do is have it so when I push a change to master it is automatically pushed to gh-pages, or at least a setup where they are mirrored.

I've already seen this question but not sure if it really answers my question with regard to these requirements:

  1. I use Tower, I don't mind using the terminal (Mac) to make changes to config, so long as the solution works with this GUI.
  2. I only want this 'mirroring' on certain repos, not on all of them on my machine.

Cheers


Solution 1:

Add the following 2 lines to the [remote "origin"] section of .git/config:

push = +refs/heads/master:refs/heads/gh-pages
push = +refs/heads/master:refs/heads/master

Every time you push it will automatically push master to gh-pages as well. I'm using this for the jQuery Lifestream project.

Solution 2:

git checkout gh-pages
git merge master
git push origin gh-pages

Solution 3:

Do not do what denbuzze suggests above!! The + (plus sign) in the push makes it quietly accept non-fastforward updates. I found out the hard way that this can irrevocably cause work to be lost by leading to dangling commits. Simply removing the plus signs makes this a safer approach.

push = refs/heads/master:refs/heads/gh-pages
push = refs/heads/master:refs/heads/master

now instead of causing a force update this will cause a warning & pull suggestion

To https://github.com/someuser/repo.git
 ! [rejected]        master -> gh-pages (fetch first)
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://github.com/someuser/repo.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Solution 4:

I'm adding further explanation to @denbuzze and @MCSDWVL answers.

If you want to push both to master and gh-pages automatically each time you run git push origin, you probably want to add a Refspec to the git config of your repo.

So, according to the git-scm book, you can add two RefSpecs, by adding two push values to the repo config file .git/config:

[remote "origin"]
url = https://github.com/<github_user>/<repo_name>
      fetch = +refs/heads/*:refs/remotes/origin/*
      push = refs/heads/master:refs/heads/master
      push = refs/heads/master:refs/heads/gh-pages

That will cause a git push origin to:

  1. Push the local master branch to the remote master branch
  2. Push the local master branch to the remote gh-pages branch

by default.

Note: using a + before the spec causes to force push to the repo. Use it with caution:

The format of the refspec is an optional +, followed by <src>:<dst>, where <src> is the pattern for references on the remote side and <dst> is where those references will be written locally. The + tells Git to update the reference even if it isn’t a fast-forward.

Solution 5:

I personally like to wrap this in an alias:

alias gpogh="git checkout gh-pages && git merge master && git push origin gh-pages && git checkout -"

This mirrors your master to gh-pages, pushes to github, then switches back the previous branch you were working on.