68

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

Community
  • 1
  • 1
Ben Everard
  • 13,652
  • 14
  • 67
  • 96
  • 1
    Github now allows pages to be driven from the master branch or `/docs` within the master branch. https://github.com/blog/2228-simpler-github-pages-publishing – Ben Everard Aug 18 '16 at 13:10

8 Answers8

108

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.

idmean
  • 14,540
  • 9
  • 54
  • 83
christianvuerings
  • 22,500
  • 4
  • 23
  • 19
  • @James You're welcome, took a while before I found this one as well. – christianvuerings Nov 08 '11 at 12:48
  • Does everyone have to do this for each local repo? Or does this happy automatically when you clone it? (after you've committed with this change) Can you commit changes to `.git/config`? – ThomasReggi Sep 28 '12 at 21:22
  • 4
    This is cool, except that this change doesn't get checked into the project, so everybody has the make the change by hand on their local boxes. It would be easy for it to get lost. – ccleve Oct 15 '12 at 20:09
  • 1
    Is there a typical way to share things like `.git/config` changes ? – blong Dec 21 '12 at 02:58
  • 1
    @b.long More and more people are using Dotfiles nowadays. http://dotfiles.github.com/ These contain useful shell scripts and good defaults – christianvuerings Mar 30 '13 at 02:44
  • What that does is to push the same files onto the two branches, is that correct? Does that build the HTML from markdown, or just mirrors the changes in the master branch? – jjmerelo May 25 '13 at 17:44
  • This created a `forces` branch and pushed just to that branch when I tried this while using SourceTree, haha... – CWSpear Jan 16 '14 at 02:49
  • I tried this using github for windows (GUI client) and it doesn't work properly. It only commits to the first branch listed under push, and if the gh-pages is first then it auto updates the to merge from the gh-pages branch. I tried using SourceTree and it only commits to the first branch but it doesn't screw with the config file. Why doesn't this work with GUI clients? I don't want to have to open a command line to push and re-enter my credentials. – Sevin7 Nov 28 '14 at 15:04
  • Thoughts on @MCSDWVL's answer/comment below? – Dan Dascalescu Jun 04 '15 at 05:16
  • Just confirming what Sevin7 said. This doesn't work properly with the Github GUI on mac either. It updates the gh-pages branch, but the master is unaffected. Too bad, this wouldn't been nice! – kthornbloom Jul 02 '15 at 12:21
  • [GitHub now allows pages to be published from any branch and directory you want.](https://github.com/blog/2228-simpler-github-pages-publishing) – Dan Dascalescu Aug 18 '16 at 17:32
67
git checkout gh-pages
git merge master
git push origin gh-pages
Steve
  • 5,771
  • 4
  • 34
  • 49
28

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.
MCSDWVL
  • 281
  • 3
  • 2
  • @denbuzze, is this true! Have you lied to us! :) – KyleMit Jun 19 '14 at 06:07
  • I'm not sure if what denbuzze suggests breaks anything because I didn't test it, but I do know that what you suggested works. – Sevin7 Nov 28 '14 at 14:41
  • 3
    @MCSDWVL: why didn't you leave a comment on denbuzze's answer? – Dan Dascalescu Jun 04 '15 at 05:13
  • [GitHub now allows pages to be published from any branch and directory you want.](https://github.com/blog/2228-simpler-github-pages-publishing) – Dan Dascalescu Aug 18 '16 at 17:32
  • my config origin section has : fetch = +refs/heads/*:refs/remotes/origin/* url = git@something:user/repo.git as it is using * , do I still need to add both lines. I need my one branch to be synced with master. – Prashant Sep 02 '19 at 14:06
9

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.

Community
  • 1
  • 1
raviolicode
  • 2,155
  • 21
  • 22
  • Will that push all the files from master into `gh-pages`, even those that have nothing to do with `gh-pages`? Why does GitHub make this so complicated? Wouldn't it be far simpler if it just rendered a folder `gh-pages`? Here's an attempt to create that kind of [gh-pages folder setup](https://gist.github.com/chrisjacob/825950). – Dan Dascalescu Jun 04 '15 at 05:16
  • 1
    [GitHub now allows pages to be published from any branch and directory you want.](https://github.com/blog/2228-simpler-github-pages-publishing) – Dan Dascalescu Aug 18 '16 at 17:32
  • I have additionally in config : [branch "master"] remote = origin merge = refs/heads/master Do I still need to add first line to push to master in Origin section ? – Prashant Sep 02 '19 at 14:13
3

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.

dhulihan
  • 11,053
  • 9
  • 40
  • 45
2

commit and push to master..

then :

git checkout gh-pages  // -> go to gh-pages branch
git rebase master // bring gh-pages up to date with master
git push origin gh-pages // commit the changes
git checkout master // return to the master branch
azl
  • 175
  • 1
  • 1
  • 7
2

OR you can just use the cmd below, this will push your local master branch to gh-pages master branch. git push -f origin master:gh-pages

DJ Jaiswal
  • 21
  • 2
1

UPDATE: GitHub now allows pages to be published from any branch and directory you want.


It was much easier for me to use the gh-pages branch as master. There's nothing magical about "master"; it's just another branch name. There is something magical about gh-pages, because that's where GitHub is looking for index.html to serve your page.

Read more in my other answer on this topic.

Using gh-pages as master is also easier than subtrees, which are easier than mirroring. You could use git subtree as described here or here: if you have a directory which contains your demo, you can push that directory to the gh-branch with one command. Let's say you name the directory gh-pages to make things clear. Then after you've committed and pushed your changes to master, run this to update gh-pages:

git subtree push --prefix gh-pages origin gh-pages

The problem is if your files in gh-pages refer to files in other directories outside it. Symlinks don't work, so you'll have to copy files in the directory that serves as gh-pages.

If you use gh-pages as master, this problem won't occur.

Community
  • 1
  • 1
Dan Dascalescu
  • 143,271
  • 52
  • 317
  • 404