« Subversion » : différence entre les versions

De WikiBR
m (hum, sinon on peut pas commiter)
(archivage)
 
(38 versions intermédiaires par 5 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
La SVN (petit nom de SubVersion) a pour but de remplacer la [[CVS]]. Pour l'utilisateur lambda, l'utilisation en est quasiment identique, mais les fonctionnalité supplémentaires sont tout de même non négligeables. Cette page explique comment importer la [[CVS]] dans SVN proprement et comment configurer les repositories pour que les accès soit limités comme désiré.
{{Archive|Désormais, le BR utilise Git}}


Elle est actuellement sur [[Skinwel]] pour 2 raisons :
La SVN (petit nom de SubVersion) a pour but de remplacer la [[CVS]]. Pour l'utilisateur lambda, l'utilisation en est quasiment identique, mais les fonctionnalités supplémentaires sont tout de même non négligeables.
* pour éviter de se retrouver comme la [[CVS]] sur [[Gwennoz]] auquel trop de personnes ont accès
* parce que skinwel héberge très peu de services


== Installation de SVN ==
== Qu'est-ce que c'est SVN ? ==


=== Installation du programme ===
=== Gestion de versions concurrentes ===


L'installation comporte plusieurs éléments : SubVersion, le viewer Web, le mailer, le script d'import de CVS...
Comme l'indique le nom d'un très cher ancêtre de SVN, Subversion est un système de gestion de version concurrente ([[VCS]]). C'est à dire un outil qui permet de programmer à plusieurs sur un projet. Chaque développeur peut travailler sereinement sur sa copie du projet car SVN se chargera de la fusion des modifications apportées par chacun des utilisateurs.
apt-get install subversion subversion-tools cvs2svn websvn svnmailer


Il faut alors créer le compte utilisateur svn
Un outil comme SVN s'avère donc être un très bon moyen de centraliser le développement d'un programme. Cela permet en effet de conserver de manière sûre une copie du projet sur le serveur avec la possibilité de structurer le développement, la certitude de pouvoir retrouver les versions antérieures grace au principe de versionning et de stockage des modifications sous forme de patchs.
adduser svn
mkdir /home/svn
chown svn:root /home/svn


=== Création des repositoires ===
=== Structure d'un projet sur la SVN ===


SVN gérant projet par projet, il faut séparer les projets. On va donc créer un repositoire par projet :
Les projets de développement (donc on exclut les modules de configuration) ont tous à peu près la même structure. Cette structure reflète le développement :
svnadmin create --fs-type fsfs /home/svn/nom_du_projet
* trunk : la branche principale du projet
* branches : répertoire qui contient les autres branches sous la forme de sous répertoire.
* tags : répertoire que contient les versions tagguées sous la forme de sous répertoire. Une version tagguée est en fait une image instantannée du développement, c'est à dire que c'est l'état du projet à un moment donné et ce qu'il y a dans le tag n'est plus censé changé.


Une fois le repositoire créé, il faut réaliser l'import depuis la [[CVS]] :
Prennons l'exemple concret de l'arborescence du projet qRezix :
  cd /tmp
  svn://swl/qrezix/
scp -r gwennoz:/home/cvs cvs
  + trunk
cvs2svn --existing-svnrepos -s /home/svn/nom_du_projet cvs/nom_du_projet
  + branches
  |  + qrezix--release--1.2
  |  + qrezix--release--1.6.2
  |  + qrezix--release--1.6.3
  |  + qrezix--release--1.6.4
  |  \ qrezix--release--2.0.0
  \ tags
      + qrezix--1.3
      + qrezix--1.6.2
      + qrezix--1.6.2-rc1
      + qrezix--1.6.2-rc2
      + qrezix--1.6.3
      + qrezix--1.6.4
      + qrezix--2.0.0-beta1
      + qrezix--2.0.0-beta2
      + qrezix--2.0.0-rc1
      + qrezix--2.0.0
      \ qrezix--2.0.1


Il faut répéter l'opération pour tous les projets...
== Utilisation de svn ==
 
SVN s'utilise aussi simplement que [[CVS]] avec cependant quelques différences notables, principalement la syntaxe différente pour un checkout.
 
La SVN gère également des branches qui permettent de continuer à développer sur une branche 'instable' pendant qu'on décide de 'releaser' une version stable.
 
Chaque projet est appelé un '''module'''.
 
==== Récupérer un module ====
 
La commande diffère selon que le module est accessible via le svnserver ou svn+ssh :
 
en svn :
svn co svn://[user@]skinwel/nom_du_projet/partie_a_co [dest_locale]
 
en http :
svn co http://[user@]skinwel/nom_du_projet/partie_a_co [dest_locale]
 
en svn+ssh :
svn co svn+ssh://user@skinwel/home/svn/nom_du_projet/partie_a_co [destination]
 
Pour la plupart des utilisateurs la branche à récupérer sera trunk, mais ça peut être aussi branches/nom_de_la_branche, ou  Tag/nom_du_tag... ou n'importe quel sous répertoire ou fichier...
 
==== Récupérer les modifications des autres ====
svn up [$fichiers$]
 
Met à jour votre copie locale, en prenant en compte les dernières versions des fichiers spécifiés. Si aucun fichier n'est spécifié, le programme mettra à jour tout le répertoire et ce récursivement. En cas de modification conflictuelle entre celle du serveur et celle de la copie locale, il faut [[#Résoudre les conflits|résoudre les conflits]].
 
Lors de l'update, une liste de noms de fichier s'affiche précédés par une lettre. Ces fichiers sont les fichiers affectés par l'update, et chaque lettre a une signification particulière, indiquant l'effet de la commande sur la version locale :
* A : Le fichier a été ajouté à la version local
* M : Le fichier est localement modifié (le contenu n'est pas touché par SVN)
* U : Le fichier est mis à jour
* G : Le fichier est patché (le fichier est modifié à la fois localement et sur la SVN et les modifications de la SVN sont fusionnées à la copie locale).
* C : La copie locale du fichier entre en conflit avec la version du serveur.
* I : Le fichier est ignoré
* D : Le fichier est supprimé
* ! : Le fichier est manquant
* ? : Le fichier n'est pas géré par SVN


<div style="border: 1px solid #6f8f9f; padding: .2em .5em .2em .5em; background-color: #EAF5FB">
==== Valider ses modifications ====
Si un projet a des sous projets importants, il faut vaut mieux créer un repositoire pour chaque sous projet important
svn status [$fichiers$]
</div>
Indique l'état de la version locale (ou d'un fichier précis de la version locale). Cela indique avec la même syntaxe que ci-dessus les fichiers qui ont étés localement modifiés par rapport à la dernière opération de 'synchronisation' avec le serveur. Cette opération étant locale, elle n'indique les modifications que par rapport à la révision actuelle. Il faut faire
svn status -u [$fichiers$]
Pour avoir les modifications par rapport à la dernière révision de la branche (c'est utile avant de faire un svn up, pour prendre ses précautions).


=== Lancement du serveur ===
svn ci [$fichiers$]


SVN utilise son propre serveur. Celui-ci se lance simplement en appelant le daemon svnserver. Pour plus de sécurité, ou pour aussi plus de clarté, on rajoute un chroot :
Cette commande envoie au serveur les fichiers modifiés. Si aucun conflit n'est détecté la modification est validée.
sudo -u svn svnserver -d -r /home/svn


== Configuration des repositoires ==
Il faut toujours [[#Récupérer les modifications des autres|updater]] la copie locale avant de commiter ses modifications, et s'assurer donc que les modifications intervenues entre temps sont compatibles


La svn sert à stocker différents type de données :
Avant d'envoyer le commit, SVN vous demandera un message expliquant le travail effectué. Ce message est suivi de la liste des fichiers avec les tags comme expliqué dans la section précédente. Dans le pire des cas, l'utilisation de la commande ''diff'' permet de voir l'ensemble des modifications :
* des projets publics
svn diff [$fichiers$]
* des projets privés
* des données de configuration


Il faut donc une configuration spécifique pour chaque type de projet.
==== Annuler ses modifications ====
Les configurations se font via :
svn revert [$fichiers$]
# la configuration du repositoire (répertoire /home/svn/projet/conf/)
# les droits d'accès au répertoire.


=== Projet public ===
Supprime toutes les modifications locales apportées au fichier spécifié depuis le dernière update.


Un projet public est un projet dont les sources sont publiques accessibles à tous. Pour un tel projet on doit avoir :
Cette commande est la seule qui ne soit pas récursive avec SVN. Pour utiliser la commande sur un répertoire de façon récursive, il faut ajouter l'option -R
* un accès anonyme en lecture
svn revert -R [$répertoire$]
* des accès lecture/écriture pour les développeurs
* un accès au websvn


'''droit d'accès au repositoire'''
==== Reverter des modifications déjà commitées ====


Les droits d'accès par défaut (644 ou 755) sont corrects, le projet étant public. Ils permettent à la fois l'accès via svnserve, web et svn+ssh. Il suffit simplement de donner la propriété du répertoire au bon utilisateur
Il suffit d'appliquer un patch inverse correspondant aux modifications que l'on souhaite annuler. Ainsi pour annuler la révision 42, il suffit de faire
cd /home/svn
chown svn -R nom_du_projet


'''configuration du serveur svn'''
svn merge --commit -42 [$répertoire$]


Le fichier svnserve.conf doit être de la forme :
ce qui indique à subversion qu'il faut appliquer à la version locale courante les changements opposés au commit 42. Il faut ensuite commiter ces changements.
# Global Section
[general]
# Name of the project
realm = le nom du projet
# Read-only anonyme access
anon-access = read
# Read/Write access for authentified users
auth-access = write
# Where to find authorised users list
password-db = /home/svn/passwd


Et remplir le fichier de /home/svn/passwd est un fichier partagé par tous les repositories public, et les projets privés. Il doit avoir des droits d'accès restrictifs (600 en svn:root).
Tu peux trouver plus d'informations dans "Version Control with Subversion" : [http://svnbook.red-bean.com/en/1.4/svn.branchmerge.commonuses.html#svn.branchmerge.commonuses.undo Undoing Changes].
# User list
[users]
name_user1 = password_user1
name_user2 = password_user2
name_user3 = password_user3
...


'''configuration du websvn'''
==== Ajouter un fichier/répertoire ====
svn add $fichiers$
svn mkdir $repertoire$


Le websvn doit afficher se projet, il faut donc l'indiquer. Pour ceci il suffit d'éditer le fichier /etc/websvn/svn_deb_conf.inc et d'ajouter la ligne :
Ajoute les fichiers spécifiés à la SVN. Les répertoires sont ajoutés immédiatement, les fichiers ajoutés par contre doivent être comités pour valider l'ajout. L'utilisation de mkdir nécessite que le répertoire n'existe pas encore. Il n'est donc pas suffisant de créer un répertoire ou un fichier dans l'arbre de la svn pour qu'il soit ultérieurement pris en compte par subversion.
$config->addRepository("nom du projet", "/home/svn/nom_du_projet");


=== Projets privés ===
==== Supprimer un fichier/répertoire ====
svn remove $fichiers$
svn rmdir $repertoire$


Les projets privés sont des projets internes au BR dont les sources ne sont pas diffusées. Il bénéficie donc d'un accès en lecture/écriture pour les développeurs... et rien d'autre.
Supprime un fichier du module. La version locale est immédiatement effacée. La suppression sera effective après un commit (et il est toujours possible avec un 'merge' de revenir en arrière).


'''droits d'accès au repositoire'''
==== Déplacer un fichier/répertoire ====
Il faut bien s'assurer que l'accès au répertoire est limité aux seuls personnes qui ont le droit d'accès... c'est à dire au serveur svn
  svn move $fichier$ $destination$
cd /home/svn
chmod g-rwx -R projet
chmod o-rwx -R projet
  chown svn -R projet


'''Configuration du serveur svn'''
Déplace le fichier ou répertoire vers sa destination. Se comporte comme mv.


Le fichier svnserve.conf doit être de la forme :
==== Créer une version tagguée ====
# Global Section
Une version tagguée est un snapshot du projet, une photographie à un instant présent. Sur svn, un snapshot est donc une copie de l'instant présent dans l'arborescence. Le plus souvent on utilise un répertoire tag :
[general]
  svn copy trunk tags/$montag$
# Name of the project
realm = le nom du projet
# Only known users can access
anon-access = none
# Read/Write access for authentified users
auth-access = write
  # Where to find authorised users list
password-db = /home/svn/passwd


Et remplir le fichier de /home/svn/passwd est un fichier partagé par tous les repositories public, et les projets privés. Il doit avoir des droits d'accès restrictifs (600 en svn:root).
==== Créer une branche ====
  # User list
De la même manière que les tags, les branches sont une séparation du projet. C'est donc également une copie, mais celle-ci destinée à évoluer... On stock habituellement les branches dans un répertoire branches :
[users]
  svn copy trunk branches/$mabranche$
name_user1 = password_user1
name_user2 = password_user2
name_user3 = password_user3
...


=== Fichiers de configuration ===
==== Backporter ====
Backporter consiste à transposer les modifications d'une branche sur une autre.
svn merge -r vInitiale:vCible $brancheorigine$ [$branchedest$]
svn ci


Les fichiers de configuration vivent dans un autre monde... dans lequel il faut absolument éviter tout accès pirate à la machine. Pour ceci le mieux est d'utiliser la méthode parano de l'authentification via ssh et du transfert via svn over ssh. La configuration est très simple
Cette syntaxe applique les modifications de la branche <code>$brancheorigine$</code> effectuées de la révision <code>vInitiale</code> à la révision <code>vCible</code> (dans cet ordre là, même si <code>vInitiale</code> > <code>vCible</code> ) la branche <code>branchedest</code> Si <code>branchedest</code> n'est pas spécifié, l'application sera réalisée sur le répertoire courant.


'''droits d'accès'''
{{Attention|bien mettre <code>vInitiale</code> et <code>vCible</code> dans le bon sens, sinon on supprime les modifications au lieu de les appliquer.}}


Le svn+ssh utilise le compte de l'utilisateur sur la machine, il faut donc que tous les utilisateurs qui l'utilisent aient un compte sur la machine. Les droits d'accès aux fichiers sont ceux de l'utilisateur. Il faut donc placer les newsmestres dans le group ''news'' et les roots dans le groupe ''adm''.
Par exemple pour importer le commit 1783 de la branches <code>qrezix--release--2.0.0</code> sur le trunk, il faut exécuter les commandes :
cd trunk
svn merge -r1782:1783 svn://swl/qrezix/branches/qrezix--release--2.0.0 .


Ensuite :
==== Résoudre les conflits ====
cd /home/svn
chmod o-rwx -R projet
chmod g+w -R projet
chown svn:news -R news //Dans le cas de la conf des newsgroups
chown svn:adm -R projet //Dans le cas des utilitaires root


'''configuration du serveur svn'''
Après un update il est possible que certaines modifications locales soit en conflit avec les modifications des autres développeurs (dans le cas en particuliers ou une même ligne a été modifiée). Il faut alors faire une fusion à la main, c'est la résolution du confit.


# Global Section
Pour ceci il faut éditer le fichier concerné. Les points conflictuels sont facilement identifiables car délimités par :
[general]
# Name of the project
realm = le nom du projet
# Only known users can access
anon-access = none
# Read/Write access for authentified users
auth-access = write
# No svn authentificcation... it uses Unix's one
# password-db = passwd


== Utilisation de svn ==
<<<<<<< .mine
... ma version du code
=======
... la version SVN du code
>>>>>>>.r849


SVN s'utilise aussi simplemennt que [[CVS]] avec cependant quelques différences notables, en particulier la checkout utilise une syntaxe différente
Il suffit alors de choisir quelles modifications doivent être conservées... et d'enregistrer le fichier. Il ne faut tout de même pas oublier de marquer le conflit comme résolu :
svn resolved $fichier$


=== Récupérer un module ===
== Installation de la SVN sous Windows ==


La commande diffère selon que le module est accessible via le svnserver ou svn+ssh :
Un bon client SVN sous Windows est [http://tortoisesvn.tigris.org/ TortoiseSVN] qui s'intègre à l'explorateur Windows et permet de réaliser toutes les commandes grace au menus contextuels associés aux répertoires.


en svn :
== Installation de SVN sous MacOS X ==
svn co svn://[user@]skinwel/nom_du_projet/partie_a_co


en svn+ssh :
Subversion est installé en standard dans Mac OS X Leopard. Si vous souhaitez utiliser la toute dernière version de subversion, ou si vous n'êtes pas encore passés sous Leopard, plusieurs solutions s'offrent à vous :
svn co svn+ssh://user@skinwel/home/svn/nom_du_projet/partie_a_co


Pour la plupart des utilisateurs la partie à co sera trunk, mais ça peut être aussi branches/nom_de_la_branche, ou  Tag/nom_du_tag... ou n'importe quel sous répertoire...
* soit vous pouvez utiliser les packages 'tout fait' qui se trouvent sur le [http://www.codingmonkeys.de/mbo/ site de Martin Ott].
----
* soit vous pouvez utiliser [http://fink.sourceforge.net/ fink] en tapant dans un Terminal :
Retour :
fink install svn
* soit vous pouvez utiliser [http://macports.org/ MacPorts] en tapant dans un Terminal :
port install subversion


[[Accueil]]
Il y a ensuite un certain nombre de client graphiques pour svn (comme [http://www.lachoseinteractive.net/en/community/subversion/svnx/download/ svnX] par exemple), si nécessaire, pour visualiser les évolutions du projet par exemple, ou bien voir sa structure.

Version actuelle datée du 6 février 2013 à 22:32

Warning.png Article archivé.
Désormais, le BR utilise Git
Warning.png

La SVN (petit nom de SubVersion) a pour but de remplacer la CVS. Pour l'utilisateur lambda, l'utilisation en est quasiment identique, mais les fonctionnalités supplémentaires sont tout de même non négligeables.

Qu'est-ce que c'est SVN ?

Gestion de versions concurrentes

Comme l'indique le nom d'un très cher ancêtre de SVN, Subversion est un système de gestion de version concurrente (VCS). C'est à dire un outil qui permet de programmer à plusieurs sur un projet. Chaque développeur peut travailler sereinement sur sa copie du projet car SVN se chargera de la fusion des modifications apportées par chacun des utilisateurs.

Un outil comme SVN s'avère donc être un très bon moyen de centraliser le développement d'un programme. Cela permet en effet de conserver de manière sûre une copie du projet sur le serveur avec la possibilité de structurer le développement, la certitude de pouvoir retrouver les versions antérieures grace au principe de versionning et de stockage des modifications sous forme de patchs.

Structure d'un projet sur la SVN

Les projets de développement (donc on exclut les modules de configuration) ont tous à peu près la même structure. Cette structure reflète le développement :

  • trunk : la branche principale du projet
  • branches : répertoire qui contient les autres branches sous la forme de sous répertoire.
  • tags : répertoire que contient les versions tagguées sous la forme de sous répertoire. Une version tagguée est en fait une image instantannée du développement, c'est à dire que c'est l'état du projet à un moment donné et ce qu'il y a dans le tag n'est plus censé changé.

Prennons l'exemple concret de l'arborescence du projet qRezix :

svn://swl/qrezix/
  + trunk
  + branches
  |   + qrezix--release--1.2
  |   + qrezix--release--1.6.2
  |   + qrezix--release--1.6.3
  |   + qrezix--release--1.6.4
  |   \ qrezix--release--2.0.0
  \ tags
      + qrezix--1.3
      + qrezix--1.6.2
      + qrezix--1.6.2-rc1
      + qrezix--1.6.2-rc2
      + qrezix--1.6.3
      + qrezix--1.6.4
      + qrezix--2.0.0-beta1
      + qrezix--2.0.0-beta2
      + qrezix--2.0.0-rc1
      + qrezix--2.0.0
      \ qrezix--2.0.1

Utilisation de svn

SVN s'utilise aussi simplement que CVS avec cependant quelques différences notables, principalement la syntaxe différente pour un checkout.

La SVN gère également des branches qui permettent de continuer à développer sur une branche 'instable' pendant qu'on décide de 'releaser' une version stable.

Chaque projet est appelé un module.

Récupérer un module

La commande diffère selon que le module est accessible via le svnserver ou svn+ssh :

en svn :

svn co svn://[user@]skinwel/nom_du_projet/partie_a_co [dest_locale]

en http :

svn co http://[user@]skinwel/nom_du_projet/partie_a_co [dest_locale]

en svn+ssh :

svn co svn+ssh://user@skinwel/home/svn/nom_du_projet/partie_a_co [destination]

Pour la plupart des utilisateurs la branche à récupérer sera trunk, mais ça peut être aussi branches/nom_de_la_branche, ou Tag/nom_du_tag... ou n'importe quel sous répertoire ou fichier...

Récupérer les modifications des autres

svn up [$fichiers$]

Met à jour votre copie locale, en prenant en compte les dernières versions des fichiers spécifiés. Si aucun fichier n'est spécifié, le programme mettra à jour tout le répertoire et ce récursivement. En cas de modification conflictuelle entre celle du serveur et celle de la copie locale, il faut résoudre les conflits.

Lors de l'update, une liste de noms de fichier s'affiche précédés par une lettre. Ces fichiers sont les fichiers affectés par l'update, et chaque lettre a une signification particulière, indiquant l'effet de la commande sur la version locale :

  • A : Le fichier a été ajouté à la version local
  • M : Le fichier est localement modifié (le contenu n'est pas touché par SVN)
  • U : Le fichier est mis à jour
  • G : Le fichier est patché (le fichier est modifié à la fois localement et sur la SVN et les modifications de la SVN sont fusionnées à la copie locale).
  • C : La copie locale du fichier entre en conflit avec la version du serveur.
  • I : Le fichier est ignoré
  • D : Le fichier est supprimé
  • ! : Le fichier est manquant
  • ? : Le fichier n'est pas géré par SVN

Valider ses modifications

svn status [$fichiers$]

Indique l'état de la version locale (ou d'un fichier précis de la version locale). Cela indique avec la même syntaxe que ci-dessus les fichiers qui ont étés localement modifiés par rapport à la dernière opération de 'synchronisation' avec le serveur. Cette opération étant locale, elle n'indique les modifications que par rapport à la révision actuelle. Il faut faire

svn status -u [$fichiers$]

Pour avoir les modifications par rapport à la dernière révision de la branche (c'est utile avant de faire un svn up, pour prendre ses précautions).

svn ci [$fichiers$]

Cette commande envoie au serveur les fichiers modifiés. Si aucun conflit n'est détecté la modification est validée.

Il faut toujours updater la copie locale avant de commiter ses modifications, et s'assurer donc que les modifications intervenues entre temps sont compatibles

Avant d'envoyer le commit, SVN vous demandera un message expliquant le travail effectué. Ce message est suivi de la liste des fichiers avec les tags comme expliqué dans la section précédente. Dans le pire des cas, l'utilisation de la commande diff permet de voir l'ensemble des modifications :

svn diff [$fichiers$]

Annuler ses modifications

svn revert [$fichiers$]

Supprime toutes les modifications locales apportées au fichier spécifié depuis le dernière update.

Cette commande est la seule qui ne soit pas récursive avec SVN. Pour utiliser la commande sur un répertoire de façon récursive, il faut ajouter l'option -R

svn revert -R [$répertoire$]

Reverter des modifications déjà commitées

Il suffit d'appliquer un patch inverse correspondant aux modifications que l'on souhaite annuler. Ainsi pour annuler la révision 42, il suffit de faire

svn merge --commit -42 [$répertoire$]

ce qui indique à subversion qu'il faut appliquer à la version locale courante les changements opposés au commit 42. Il faut ensuite commiter ces changements.

Tu peux trouver plus d'informations dans "Version Control with Subversion" : Undoing Changes.

Ajouter un fichier/répertoire

svn add $fichiers$
svn mkdir $repertoire$

Ajoute les fichiers spécifiés à la SVN. Les répertoires sont ajoutés immédiatement, les fichiers ajoutés par contre doivent être comités pour valider l'ajout. L'utilisation de mkdir nécessite que le répertoire n'existe pas encore. Il n'est donc pas suffisant de créer un répertoire ou un fichier dans l'arbre de la svn pour qu'il soit ultérieurement pris en compte par subversion.

Supprimer un fichier/répertoire

svn remove $fichiers$
svn rmdir $repertoire$

Supprime un fichier du module. La version locale est immédiatement effacée. La suppression sera effective après un commit (et il est toujours possible avec un 'merge' de revenir en arrière).

Déplacer un fichier/répertoire

svn move $fichier$ $destination$

Déplace le fichier ou répertoire vers sa destination. Se comporte comme mv.

Créer une version tagguée

Une version tagguée est un snapshot du projet, une photographie à un instant présent. Sur svn, un snapshot est donc une copie de l'instant présent dans l'arborescence. Le plus souvent on utilise un répertoire tag :

svn copy trunk tags/$montag$

Créer une branche

De la même manière que les tags, les branches sont une séparation du projet. C'est donc également une copie, mais celle-ci destinée à évoluer... On stock habituellement les branches dans un répertoire branches :

svn copy trunk branches/$mabranche$

Backporter

Backporter consiste à transposer les modifications d'une branche sur une autre.

svn merge -r vInitiale:vCible $brancheorigine$ [$branchedest$]
svn ci

Cette syntaxe applique les modifications de la branche $brancheorigine$ effectuées de la révision vInitiale à la révision vCible (dans cet ordre là, même si vInitiale > vCible ) la branche branchedest Si branchedest n'est pas spécifié, l'application sera réalisée sur le répertoire courant.

Warning.png Attention : bien mettre vInitiale et vCible dans le bon sens, sinon on supprime les modifications au lieu de les appliquer.

Par exemple pour importer le commit 1783 de la branches qrezix--release--2.0.0 sur le trunk, il faut exécuter les commandes :

cd trunk
svn merge -r1782:1783 svn://swl/qrezix/branches/qrezix--release--2.0.0 .

Résoudre les conflits

Après un update il est possible que certaines modifications locales soit en conflit avec les modifications des autres développeurs (dans le cas en particuliers ou une même ligne a été modifiée). Il faut alors faire une fusion à la main, c'est la résolution du confit.

Pour ceci il faut éditer le fichier concerné. Les points conflictuels sont facilement identifiables car délimités par :

<<<<<<< .mine
... ma version du code
=======
... la version SVN du code
>>>>>>>.r849

Il suffit alors de choisir quelles modifications doivent être conservées... et d'enregistrer le fichier. Il ne faut tout de même pas oublier de marquer le conflit comme résolu :

svn resolved $fichier$

Installation de la SVN sous Windows

Un bon client SVN sous Windows est TortoiseSVN qui s'intègre à l'explorateur Windows et permet de réaliser toutes les commandes grace au menus contextuels associés aux répertoires.

Installation de SVN sous MacOS X

Subversion est installé en standard dans Mac OS X Leopard. Si vous souhaitez utiliser la toute dernière version de subversion, ou si vous n'êtes pas encore passés sous Leopard, plusieurs solutions s'offrent à vous :

  • soit vous pouvez utiliser les packages 'tout fait' qui se trouvent sur le site de Martin Ott.
  • soit vous pouvez utiliser fink en tapant dans un Terminal :
fink install svn
  • soit vous pouvez utiliser MacPorts en tapant dans un Terminal :
port install subversion

Il y a ensuite un certain nombre de client graphiques pour svn (comme svnX par exemple), si nécessaire, pour visualiser les évolutions du projet par exemple, ou bien voir sa structure.