Le présent document traite de l’installation d’un serveur SVN sur le système d’exploitation DEBIAN
- Nous prévoyons d’accéder aux dépôts SVN via SSH.
- Les serveur SVN est hébergé sur l'hôte labo.
- Nous prévoyons de stocker les dépôts SVN sous le répertoire "
/var/svn
".
- Nous allons créer trois utilisateurs SVN bill, joe et guest.
Récapitulatif:
Utilisateur SVN |
Utilisateur UNIX |
Groupe UNIX |
Mot de passe UNIX |
Mot de passe SVN |
bill |
bill |
svnuser |
pu_bill |
ps_bill |
joe |
joe |
svnuser |
pu_joe |
ps_joe |
guest |
someone |
svnuser |
password_for_unix |
password_for_svn |
Notez que les trois utilisateurs UNIX appartiennent au même groupe ("svnuser", en l'occurrence).
$apt-get install subversion
Lorsque le dépôt SVN est accédé via SSH, le serveur SVN s’exécute avec l’UID de l’utilisateur authentifié par SSH. Dans notre exemple, l'UID peut prendre 3 valeurs: bill, joe ou someone.
Si plusieurs utilisateurs doivent accéder au dépôt, ces derniers doivent appartenir au même groupe (autrement dit, ils doivent présenter le même GID).
- Nous créons un groupe pour tous les utilisateurs du dépôt (le groupe "
svnuser
").
- Puis nous créons trois utilisateurs qui appartiennent à ce groupe.
$groupadd svnuser
$useradd -g users -G svnuser -s /bin/bash -p pu_bill -d /home/bill bill
$useradd -g users -G svnuser -s /bin/bash -p pu_joe -d /home/joe joe
$useradd -g users -G svnuser -s /bin/bash -p password_for_unix -d /home/someone someone
$mkdir /home/bill
$mkdir /home/joe
$mkdir /home/someone
$chown bill:users /home/bill
$chown joe:users /home/joe
$chown someone:users /home/someone
$mkdir /var/svn
$chown root:svnuser /var/svn/
$chmod g+xwr /var/svn/
Notez que le répertoire utilisé pour stocker les dépôts appartient au groupe "svnuser".
Par conséquent, les utilisateurs bill, joe et someone possèdent les droits en exécution, lecture et écriture sur ce répertoire.
$svnadmin create /var/svn/projet-test
$chown -R root:svnuser /var/svn/projet-test
$chmod -R g+xwr /var/svn/projet-test
La commande svnadmin create
va créer une arborescence sous le répertoire /var/svn/projet-test
.
Assurez-vous que les utilisateurs bill, joe et someone possèdent les autorisations nécessaires pour accéder au nouveau dépôt.
$chown -R root:svnuser /var/svn/projet-test
$chmod -R g+xwr /var/svn/projet-test
Editez le fichier: /var/svn/projet-test/conf/svnserve.conf
. Ce fichier doit contenir les lignes suivantes:
Editez le fichier: /var/svn/projet-test/conf/passwd
. Dans ce fichier, vous déclarez les utilisateurs SVN, ainsi que leurs mots de passe.
Créez le fichier "/etc/init.d/svnserve
".
Déclarer le service:
$chmod +x /etc/init.d/svnserve
$update-rc.d svnserve defaults
Pour démarer le service:
$/etc/init.d/svnserve start
- Le serveur SVN est hébergé sur l'hôte "
labo
".
- Le chemin vers le dépôt du projet est "
/var/svn/projet-test
".
Utilisateur SVN |
Utilisateur UNIX sur labo |
URL |
Authentification SVN |
bill |
bill |
svn+ssh://bill@labo/var/svn/projet-test |
--username bill --password ps_bill |
joe |
joe |
svn+ssh://joe@labo/var/svn/projet-test |
--username joe --password ps_joe |
guest |
svnusers |
svn+ssh://svnusers@labo/var/svn/projet-test |
--username guest --password password_for_svn |
$svn co svn+ssh://bill@labo/var/svn/projet-test --username bill --password ps_bill
La commande précédente va créer le répertoire projet-test
. Ce répertoire contient une copie du dépôt.
Notez le numéro de révision de la copie de travail : 0.
Il est possible d’obtenir une copie du projet pour un numéro de révision donné.
svn co svn+ssh://bill@labo/var/svn/projet-test --username bill --password ps_bill -r <numéro de révision>.
$svn add README.TXT
$svn commit README.TXT -m "First import"
$svn add hello_wolrd.pl
$svn commit hello_wolrd.pl -m "First import"
Il est intéressant de jeter un coup d’oeil aux numéros de révisions des entrées de la copie de travail, ainsi que du dépôt.
Copie de travail
Dépôt
Notez que, à ce stade, les numéros de révision au sein du dépôt, et au sein de la copie de travail sont différents.
Si vous mettez à jour votre copie de travail (svn update
), alors les numéros de révision des entrées de la copie de travail seront tous identiques.
Les numéros de révision s'appliquent à tout le dépôt (et pas à des fichiers individuels).
Si une entrée du dépôt change (
commit
), si une entrée est ajoutée au dépôt (
add
), ou si une entrée est supprimée du dépôt (
remove
), alors c’est le dépôt dans sa globalité qui change.
Si l'on met à jour la copie de travail:
$svn remove hello_wolrd.pl
$svn commit hello_wolrd.pl -m "Remove this file..."
Là encore, il est intéressant de jeter un coup d’oeil aux numéros de révisions des entrées de la copie de travail, ainsi que du dépôt.
Vous constatez que les numéros de révisions des entrées du dépôt diffèrent de ceux des entrées de la copie de travail. Il est recommandé de mettre à jour la copie de travail (svn update
).
$mkdir bin
$svn add bin
$svn commit bin -m "Test on a directory"
$svn remove bin
$svn commit bin -m "Remove this directory..."
$svn update
Lors d’une mise à jour de la copie de travail, SVN peut signaler des conflits (CF section "Gestion des conflits").
Il est possible de mettre à jour le projet par rapport à un numéro de révision donné.
svn update -r <numéro de version>
Il est possible d'obtenir de l'information sur:
Exemple:
$svn info <chemin vers le fichier>
$svn info <url vers le fichier>
Remarque: les numéros de révision de la copie de travail de Bill et du dépôt ne sont pas identiques.
- Le numéro de révision de la copie de travail de Bill est 4.
- Le numéro de révision du dépôt est 5.
La copie de travail de Bill n'est donc pas à jour.
Par conséquent, si Bill tente d'enregistrer les modifications qu'il a apportées au fichier, l'opération échouera.
Solution: il faut mettre à jour sa copie de travail (svn update
).
Afficher les différences entre un fichier de la copie de travail, et son "correspondant" dans le dépôt, à numéros de révisions égaux.
$svn diff README.TXT
La comparaison s'effectue "à numéros de révision égaux" (le numéro de révision du fichier de la copie de travail).
Dans l'exemple ci-dessous, le numéro de révision utilisé pour la comparaison est 4. C'est le numéro de révision du fichier de la copie travail.
Afficher les différences entre un fichier de la copie de travail, et la dernière version du fichier (dans le dépôt).
$svn diff README.TXT -r HEAD
La comparaison s'effectue "à numéros de révision différents".
Dans l'exemple ci-dessous, on compare le fichier de la copie de travail dont le numéro de révision est 4, avec son "correspondant" dans le dépôt dont le numéro de révision est 5.
Afficher les différences entre deux révisions d'un fichier
$svn diff README.TXT -r 8:10
Il est possible de lister les entrées:
- De la copie de travail.
- Du dépôt.
Copie de travail
$svn list -v
Dépôt
$svn list <url vers le dépôt> -v
Afficher toutes les modifications apportées à un fichier donné
$svn log -v README.TXT
Afficher toutes les modifications apportées à un fichier donné, sur un numéro de révision donné
$svn log -v README.TXT -r 6
Afficher toutes les modifications apportées à un fichier donné, entre deux numéros de révision
$svn log -v README.TXT -r 6:11
Si le fichier n'est plus dans la copie de travail
$svn log svn+ssh://bill@labo/var/svn/projet-test/bin@3 -v
Les conflits apparaissent toujours lors d'une mise à jour de la copie de travail (svn update
).
Un conflit apparaît dans la situation suivante:
- L'utilisateur travaille sur un fichier qui n'est pas à jour par rapport au dépôt. Autrement dit: le numéro de révision du fichier de la copie de travail est inférieur à celui du dépôt (les numéros de révision sont globaux au dépôt).
- L'utilisateur apporte une modification au fichier de sa copie de travail. Par rapport à la version du fichier stockée dans le dépôt, la modification apportée à la copie de travail n'est pas un simple ajout.
- L'utilisateur tente d'enregistrer les modifications qu’il a apportées au fichier (
svn commit
), dans le dépôt. Puisque sa copie de travail n'est pas à jour, l'enregistrement des modifications dans le dépôt est refusé.
- L'utilisateur tente alors de mettre à jour sa copie de travail (
svn update
). SVN ne peut pas "injecter" les modifications apportées à la copie de travail dans "la version du dépôt", sans modifier la version du dépôt. Un conflit est levé.
À ce stade, trois fichiers sont créés :
- README.TXT.mine: le fichier que Bill a essayé "d'injecter" dans le dépôt.
- README.TXT.r5: Le contenu du fichier avant que Bill y apporte des modifications.
- README.TXT.r6: le contenu du fichier "dans le dépôt".
Vous remarquerez également que le fichier README.TXT contient désormais "les différences" à l'origine du conflit.
Pour SVN, une branche n’est qu’une "copie d'une partie d'un dépôt".
Autrement dit: créer une branche revient à copier une partie d'un dépôt.
Par convention, lorsque l’on crée un dépôt, on crée un répertoire « trunk » qui sera la « branche principale » (le tronc) du projet.
Notez que le choix du nom « trunk » est arbitraire.
Dans l’exemple qui suit, nous créerons un répertoire « master ».
Création du tronc:
Création d'une branche: