Sphinx et git

L’organisation de la documentation sous Sphinx avec sa logique de fichiers source en rst se prête très bien à l’utilisation d’un gestionnaire de version comme git.

Pour que l’intégration soit complète, le programme hook suivant permet de déclencher la compilation des sources lors d’un push concernant la branche master (on peut facilement renommer la branche concernée).

Fichier .git/hooks/post-update:

#!/bin/zsh
branch=${1##*/}
echo Update to $branch
if [ $branch = "master" ] ; then
    cd ..
    export GIT_DIR=`pwd`/.git
    git reset --hard master
    make html
fi

Le point le plus subtil est la ligne export GIT_DIR=`pwd`/.git qui permet d’éviter l’erreur suivante

remote: fatal: Not a git repository: '.'

La copie de travail du dépot git ne doit servir qu’à la publication du site html issu de la compilation Sphinx. C’est pour cela qu’on fait un git reset --master.

Enfin, pour autoriser le push vers ce dépôt non-bare, on ajoute la rubrique suivante au fichier .git/config:

[receive]
    denyCurrentBranch = ignore

Limiter à une branche

Dans l’exemple suivant, seul un commit sur la branche dtp est accepté.

Fichier .git/hooks/pre-receive:

#!/bin/zsh
read line
a=(${=line})
branch=${a[3]##*/}
echo "Attempt to push to branch $branch"
if [ $branch != "dtp" ] ; then
    echo Error : branch "dtp" only
    exit 1
fi