Skip to content

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 Stéphane Téletchéa

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.

Répondre à cet article