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-commitqui après chaque nouveau commit sur la branchemasterva synchroniser la branchegh-pagesavecmaster - une modification du fichier
.git/configpour faire un push simultané des branchesmasteretgh-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.