Github: Mirroring gh-pages to master

GitGithubGithub PagesGit Tower

Git Problem Overview


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

Git Solutions


Solution 1 - Git

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

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

Solution 3 - Git

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 - Git

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 - Git

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.

Solution 6 - Git

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

Solution 7 - Git

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

Solution 8 - Git

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBen EverardView Question on Stackoverflow
Solution 1 - GitchristianvueringsView Answer on Stackoverflow
Solution 2 - GitSteveView Answer on Stackoverflow
Solution 3 - GitMCSDWVLView Answer on Stackoverflow
Solution 4 - GitraviolicodeView Answer on Stackoverflow
Solution 5 - GitdhulihanView Answer on Stackoverflow
Solution 6 - GitazlView Answer on Stackoverflow
Solution 7 - GitDJ JaiswalView Answer on Stackoverflow
Solution 8 - GitDan DascalescuView Answer on Stackoverflow