Accueil > GNU/Linux > Installer un serveur subversion local pour gérer ses projets
Installer un serveur subversion local pour gérer ses projets
mardi 7 juillet 2009, par
Quand il s’agit de gérer des projets à plusieurs, ou seul mais en différents sites, il devient rapidement difficile de suivre l’évolution des modifications, voici comment résoudre ces problèmes simplement, en mettant en place un serveur subversion.
Cet article a pour but d’être « efficace », nous laisserons de côté les aspects de sécurité (pour la clé ssh).
Etape 1 -créer une clé ssh sans mot de passe
sh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/stephane/.ssh/id_rsa): (laisser le choix par défaut)
Enter passphrase (empty for no passphrase): (taper entrée, pas de mot de passe)
Enter same passphrase again: (entrée à nouveau)
Your identification has been saved in /home/stephane/.ssh/id_rsa.
Your public key has been saved in /home/stephane/.ssh/id_rsa.pub.
Etape 2 - Installation et initialisation du dépôt
Il s’appelle ici « admin ».
Installer le serveur
urpmi subversion-server subversion-tools
Démarrage du serveur (modification du fichier /etc/xinet.d/svnserve)
diff /etc/xinetd.d/svnserve*
5c5
< disable = no
---
> disable = yes
Relancer le serveur
service xinetd restart
Création du dépôt initial « admin »
svnadmin create --fs-type fsfs /var/lib/svn/repositories/admin
Il est possible d’ajuster les permissions pour qu’il appartienne à l’utilisateur local
cd /var/lib/svn/repositories/
chown -R stephane admin/
Ajouter l’autentification sans mot de passe sur l’hôte local (c’est pour cela qu’il faut créer la clé ssh sans mot de passe comme ci-dessus)
cd ~/.ssh
cat id_rsa.pub >> authorized_keys
Importer dans le répertoire utilisateur le dépôt initial
mkdir ~/svn (ou tout autre nom)
cd ~/svn/
Import du contenu du répertoire créé sur le compte local dans l’arborescence du système :
mkdir admin
cd admin
emacs joliscript.sh
cd ../
svn import admin svn+ssh://stephane@localhost/var/lib/svn/repositories/admin -m "- Import initial"
Cette étape va mettre le fichier juste créé sur le serveur (dans notre cas il s’agit de la machine pour le client et le serveur)
Ensuite, comme le fichier est maintenant présent sur le serveur, il est possible d’effacer notre répertoire local puis de récupèrer le contenu du serveur distant :
mv admin/ admin_old
svn co svn+ssh://stephane@localhost/var/lib/svn/repositories/admin
# L’ancienne copie ne sert à rien, on l’efface
rm -rf /svn/admin_old
Le contenu du répertoire admin est bien conforme à ce qui est présent sur le serveur
ls ~/svn/admin/
joliscript.sh
Attention, maintenant il y a une copie locale (située dans le répertoire $HOME/svn) et une copie distante (située dans /var/lib/svn/repositories/admin).
Le principe, c’est que la copie distante est la référence : le code est modifié dans le répertoire local, et envoyé dans le répertoire distant.
emacs joliscript.sh
Validation des différences avec l’ancien :
svn diff joliscript.sh (par défaut, le diff va faire la différence entre ce qui est modifié et la version présente sur le serveur)
Il est aussi possible de vérifier les modifications par rapport à d’autres révisions
svn diff joliscript.sh -r32
Pour avoir le contenu des messages :
svn log |less
Exemple
Vérification du travail réalisé par rapport à la version présente sur le dépôt distant :
svn diff admin_svn.txt
Index: admin_svn.txt
===================================================================
--- admin_svn.txt (révision 37)
+++ admin_svn.txt (copie de travail)
@@ -28,8 +28,11 @@
svn import admin
svn+ssh://stephane@localhost/var/lib/svn/repositories/admin -m "- Import initial"
-# Faire un checkout du dépôt
+# cela va mettre le fichier que tu viens de mettre dans ta copie locale sur le serveur (ici normalement c'est ta machine, donc pas de notion très claire de client et de serveur, mais c'est le principe)
+
+# Ensuite, comme le fichier est maintenant présent sur le serveur, on efface notre répertoire local, puis on récupère le contenu du serveur distant :
mv admin/ admin_old
svn co svn+ssh://stephane@localhost/var/lib/svn/repositories/admin
+# L'ancienne copie ne sert à rien, on l'efface
Pour savoir où on en est dans les modifications :
svn status
Qui donne :
? admin_localhost.txt
M admin_svn.txt
M indique que le fichier existait et a été modifié
? indique que le dépôt distant ne sait pas ce qu’est le fichier "admin_localhost.txt"
Pour ajouter le fichier dans le dépôt distant :
svn add admin_localhost.txt
A admin_localhost.txt
Pour effacer un fichier
svn del joliscript.sh
Il faut garder en tête qu’il y a toujours une copie locale et une copie distante et que les deux s’ignorent tant que l’on a pas « commité » les versions distantes. Comme pour ce cas, il s’agit de valider le changement du fichier, puis l’ajout d’un autre fichier, nous allons le réaliser.
Pour envoyer au serveur distant la modification, il faut utiliser la commande commit ou ci en abrégé :
svn ci -m "- Modification de la config svn pour intégrer l'explication pour Guillaume
- Ajout de la modification des utilisateurs sur la machine"
Ajout doc/admin_localhost.txt
Envoi doc/admin_svn.txt
Transmission des données ..
Révision 38 propagée.
A noter que la raison de la modification à été indiquée par l’option -m. Ce message est optionnel, mais bien utile pour savoir à quoi s’en tenir au niveau des modifications (quand on fait svn log, c’est ce message qui est affiché). Le format est libre, et on retourne à la ligne avec entrée, la commande est terminée quand on ferme les guillemets.
La version distante est maintenant à jour, mais pas la copie locale (en tous cas l’historique des fichiers), comme en témoigne l’historique des modifications :
svn log |head
------------------------------------------------------------------------
r37 | stephane | 2009-06-26 18:52:40 +0200 (ven. 26 juin 2009) | 3 lines
Il faut « indiquer » à la copie locale qu’il y a eu une modification. Pour le faire, il faut faire un update (vérifier si la copie distante est plus récente que la version locale) :
svn up
À la révision 38.
La révision de l’historique est maintenant bonne :
svn log |head
------------------------------------------------------------------------
r38 | stephane | 2009-07-07 15:22:26 +0200 (mar. 07 juil. 2009) | 2 lines
- Modification de la config svn pour intégrer l'explication pour Guillaume
- Ajout de la modification des utilisateurs sur la machine
------------------------------------------------------------------------
r37 | stephane | 2009-06-26 18:52:40 +0200 (ven. 26 juin 2009) | 3 lines
...
Et voila, la boucle est bouclée !
Résumé des commandes principales
svn co svn+ssh ://chemin... -> à faire au tout début pour faire la copie locale
svn up -> à faire régulièrement pour prendre les dernières infos du serveur
svn log -> pour avoir l’historique
svn ci -m "bla bla" -> pour enregistrer les modifications sur le serveur
svn add ou svn del pour ajouter/supprimer des dossiers/fichiers dans le svn
svn diff (fichier) -r n pour vérifier les différences avec la version n (éventuellement uniquement pour (fichier))
Attention, il faut toujours utiliser la command svn pour ajouter/déplacer/effacer des fichiers, sinon subversion ne saura pas quoi faire des fichiers ayant apparu/disparu (ils seront marqués par un point d’interrogation).
Application à la gestion d’un projet
Création d’un dépôt pour le projet
mkdir ~/svn/beauprojet/
Ajout de la structure du projet, des sources, des binaires, des données, et éventuellement des articles de référence (et l’article en cours d’écriture) :
mkdir ~/svn/beauprojet/bin
mkdir ~/svn/beauprojet/src
mkdir ~/svn/beauprojet/doc
mkdir ~/svn/beauprojet/data
mkdir ~/svn/beauprojet/web
Que l’on aurait pu résumer en :
mkdir -p ~/svn/beauprojet/{bin,src,doc,data,web}
Intégration au shell
Soit vous utilisez déjà un répertoire /bin référencé dans le .bash_profile, par exemple
grep PATH /home/stephane/.bash_profile
PATH=\$PATH:\$HOME/bin
Il suffit dans ce cas de faire les liens symboliques à partir du projet vers ce chemin référencé :
for file in `ls ~/svn/beauprojet/bin/*`;
do
ln -s $file ~/bin/
done
Soit on peut ajouter ce répertoire dans le fichier bash_profile :
PATH=\$PATH:~/svn/beauprojet/bin
Pour aller plus loin
La documentation en ligne de subversion est très complète :
http://subversion.tigris.org/
http://svnbook.red-bean.com/
http://subversion.tigris.org/faq.html
Merci à C. Caron et à toute l’équipe de MIG (en particulier Véronique et Eric) pour leur précieuse aide.