Dans le cadre d'un projet d'application web, j'utilise la possibilité qu'offre GitHub de pouvoir visualiser les fichiers contenus dans la branche gh-pages comme des pages web. Cela signifie concrètement que le contenu de la branche https://github.com/pierrepo/DensiPara/tree/gh-pages sera visible à l'adresse http://pierrepo.github.io/DensiPara/.

Comme master est la branche principale de mon projet, j'étais amené en permanence à resynchroniser ma branche gh-pages avec master :

git checkout gh-pages
git rebase master
git push
git checkout master

Pour automatiser cela, j'ai appliqué :

  • un hook post-commit qui après chaque nouveau commit sur la branche master va synchroniser la branche gh-pages avec master
  • une modification du fichier .git/config pour faire un push simultané des branches master et gh-pages

Hook post-commit

Créer le fichier .git/hooks/post-commit :

#!/bin/bash

set -eu

# sync 'gh-pages' branch with 'master' branch' 

currentbranch=$(git symbolic-ref --short HEAD)

if [ "$currentbranch" == "master" ]
then
    echo "post-commit hook: sync 'gh-pages' branch with master."
    git checkout gh-pages
    git rebase master
    git checkout master
else
    echo "post-commit hook: not in master branch ($currentbranch). Nothing to do."
fi

exit 0

puis le rendre exécutable :

chmod +x .git/hooks/post-commit

Je souhaite que ce hook ne fonctionne que dans la branche master d'où le test dans le script.

Push master et gh-pages

Dans le fichier .git/config, ajouter les lignes :

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

à la fin de la section [remote "origin"]. Ce qui donne au final :

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@github.com:pierrepo/DensiPara.git
    fetch = +refs/heads/*:refs/remotes/origin/*
    push = refs/heads/master:refs/heads/master
    push = refs/heads/gh-pages:refs/heads/gh-pages
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "gh-pages"]
    remote = origin
    merge = refs/heads/gh-pages

Dès lors, dès que je réalise un commit dans la branche master, celui-ci est automatiquement reporté dans la branche gh-pages. Et dès que je fais un push, ce sont les deux branches master et gh-pages qui sont envoyées sur GitHub.

PS : il est parfaitement possible de rendre la branche gh-pages la branche par défaut sur GitHub, mais je souhaitais conserver master comme branche principale par homogénéité avec mes autres projets.