L'installation du suivi de configuration (/etc) avec git est automatisée par l'installation d'un paquet, voir Git/SuiviDeConfiguration |
Installation manuelle du suivi de config avec git (déconseillée)
On installe git :
# aptitude install git-core
On créée un dépôt général pour toute la machine. Attention à bien régler les droits : seul root doit pouvoir accéder au dépôt, sinon les fichiers du genre shadow seraient accessibles à tous.
# cd / # git init-db <--- Ou "git init" sur Git 1.5 (Debian Lenny, Ubuntu Gutsy) # chmod u=rwx,go= /.git <--- important ! Seul "root" doit pouvoir accéder au dépôt
Pour éviter d'avoir des "saletés" directement à la racine (/), on déplace le dépôt vers /var/lib/git. Le répertoire /.git à la racine ne sera en fait qu'un lien symbolique vers le véritable emplacement du dépôt :
# mkdir /var/lib/git # mv /.git /var/lib/git/root # ln -s /var/lib/git/root /.git
On veut suivre /etc et /usr/local seulement, pour cela on modifie les exclusions au niveau du dépôt, dans le fichier /var/lib/git/root/info/exclude :
# Le fichier /var/lib/git/root/info/exclude à modifier ou créer # Par défaut, on exclut tout sauf /etc /* !/etc # ... mais dans /etc on interdit certains fichiers : /etc/*shadow* /etc/ssh/ssh_host_*_key /etc/mtab /etc/adjtime /etc/ld.so.cache # On n'interdit pas non plus le parcours de /usr. Mais dans ce parcours, # on interdit tout sauf /usr/local. C'est la technique pour inclure /usr/local... !/usr /usr/* !/usr/local # quelques type fichiers à ne pas jamais considérer, globalement : *.dpkg-old *.dpkg-new .*.swp *~ *#
On fait le premier ajout de tous les fichiers à suivre (sauf les exclus indiqués ci-dessus), puis le premier commit :
# cd / # git add etc usr/local # git commit -m "mise en route du suivi : /etc et /usr/local" --author "Prenom NOM <prenom.nom@auf.org>"
On utilisera surtout git avec sudo. Il faut donc dire à sudo de ne pas supprimer les variables d'environnement utiles à git :
# (... extrait de /etc/sudoers ...) # une ligne à ajouter au début de /etc/sudoers : Defaults env_keep += "GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL"
Quelques automatisations
Note : ces automatisations sont déjà mise en place par notre paquet Debian.
Pour lancer un "status" à chaque connexion sur le serveur (très très utile) :
- Permettre aux gens du groupe "admin" de lancer git status sans mot de passe :
# et à ajouter vers la fin de /etc/sudoers : %admin ALL=(ALL) NOPASSWD: /usr/bin/git status -a
Lancer le git status (via sudo) dans le /etc/profile, et configurer un peu les variables GIT :
# A ajouter à la fin de /etc/profile : if [ "$PS1" ]; then # on lance un git status sur l'utilisateur est dans le groupe # admin ou bien si c'est root if $(id -Gn | grep -qw admin) || [ $(id -u) -eq 0 ]; then [ -x /usr/bin/git -a -e /.git ] && (cd / && sudo /usr/bin/git status -a) fi # les lignes suivantes tentent de configurer les variables GIT_* # si les résultats ne sont pas bien "devinés", définir les bonnes valeurs dans .bashrc GIT_AUTHOR_NAME=${GIT_AUTHOR_NAME:=$(getent passwd $(id -un)|cut -d: -f5|cut -d, -f1)} GIT_AUTHOR_EMAIL=${GIT_AUTHOR_EMAIL:=$(id -un)@$(hostname -f)} GIT_COMMITTER_NAME=${GIT_COMMITTER_NAME:=$GIT_AUTHOR_NAME} GIT_COMMITTER_EMAIL=${GIT_COMMITTER_EMAIL:=$GIT_AUTHOR_EMAIL} export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL fi
Pour envoyer un mail à chaque commit :
Créer un script /.git/hooks/post-commit :
recipients="admins@XX.auf.org" # adresse pour l'envoi du mail # On modifie un peu la sortie de git show : # 1) on ajoute "From git hostname" devant le nom en From # 2) on retire le [PATCH] dans le sujet, replacé par git-commit: # 3) on ajoute un champ To: # et on maile le tout via sendmail PATH=/usr/sbin:/usr/bin:/sbin:/bin git show --pretty=email | sed '1,6s/^From: /From: git '`hostname -f`' - /;1,6s/^Subject: \[PATCH\]/Subject: git-commit:/;2iTo: '"${recipients}" | head -c 16k | /usr/lib/sendmail ${recipients} exit 0
- Activer le script :
# chmod +x /.git/hooks/post-commit
Faire un petit commit de test afin de vérifier ça marche, notamment que sendmail (Postfix, Exim, ...) envoie bien le message.