Subversion

De Linuxmemo.


Sommaire

Le client

Commandes memo rapide

Première copie du site en local:

svn co url

url = file:///var/lib/svndepots/etc-svn/ ou svn://<your_ip>/<repository_name> ou http://<your_ip>/<repository_name> (avec apache le module dav_svn)

Mise a jour de la copie local:

svn update

Savoir ce qui a change:

svn log -r xxx -v fichier       ou bien      svn log -r xxx:xxxx -v fichier

Avoir le détail des changement diff:

svn diff -r xxx:xxx fichier

Afficher en fichier:

svn cat  -r xxx:xxx fichier

Savoir ce qui a change sans toucher a la copie local:

svn log -v -r PREV:COMMITTED ou svn log -v -r xxx:COMMITTED

Avoir de l'aide

Commandes

svn help
svn help diff
svn help up

Manuel de Subversion

http://svnbook.red-bean.com/nightly/en/svn-book.html

Info sur le checkout local

Obtenir le statut des fichiers du checkout local

svn status

Obtenir des infos sur le checkout local (y compris sa révision)

svn info

Retrouver le chemin du repository

svnpath

Consulter et rapatrier les modifications

Recevoir les modifications qui ont été committées dernièrement

svn up

Savoir qui a engendré chaque ligne d'un fichier

svn annotate
svn blame
svn praise

Voir le log des commits

svn log

Gestion des modifications locales

Voir la différence entre votre checkout et le repository

svn diff
svn diff

Configurer le comportement de svn diff

svn diff --diff-cmd /usr/bin/diff -x -ubB # patch unified ou les lignes blanches et caracteres vides sont ignorés

Retirer temporairement des modifications locales

svn diff > modifs.patch
patch -p0 -R < modifs.patch
[...faire des trucs sans les modifs, par exemple tester...]
patch -p0 < modifs.patch

Annuler les modifications qu'on a faites dans un fichier

svn revert

Committer

svn ci -m "message"
svn ci -m "message"

Committer avec un long message à entrer dans un éditeur

svn ci
svn ci

Modifier un message de commit

svn propedit --revprop svn:log --revision

Résoudre un conflit, après avoir résolu dans le contenu du fichier lui-même

# après un svn update qui affiche des 'C'
svn resolved
# le 'C' ne doit plus apparaître devant le fichier résolu dans svn status

Différences entre révisions

Voir la différence entre la version locale et une révision antérieure

svn diff -r

Voir la différence entre 2 révisions

svn diff -r :

Voir la différence entre 2 branches

svn diff

Revenir à une version antérieure (pour voir le code, pas pour committer en revertant)

svn update -r

Reverter à une version antérieure (pour committer et revenir à une ancienne version)

svn merge -r : .
# committer les changements (en précisant les numéros de versions)

Créer des branches ou tags

Créer une branche ou un tag en copiant le trunk du repository (committé directement)

svn cp $(svnpath)/trunk $(svnpath)/branches/
svn cp $(svnpath)/trunk $(svnpath)/tags/
svn cp $(svnpath)/trunk $(svnpath)/path/to/where/you/want

Créer une branche ou un tag à partir du répertoire local (sans committer directement)

svn cp . /path/to/where/you/want
# committer

Plus d'infos

svn help cp

Merge entre branches

Merger des changements d'une branche dans une autre

svn merge -r :\

# committer en notant les numéros de révision dans le message de commit
# pour pouvoir remerger à partir de plus tard
# NOTE: les tags doivent être donnés avec les url complètes du repository

Merger les changements entre 2 tags dans une branche

svn merge
# NOTE: les tags doivent être donnés avec les url complètes du repository

Merger une branche dans le tronc

  • Tout d'abord s'assurer que la branche et le tronc sont à jour, merger le tronc dans la branche.
  • Lancer la commande suivante depuis le répertoire principal du tronc:
svn merge svn+ssh://.../project/trunk svn+ssh://.../project/branches/BRANCHNAME .

Création d'un repository

  • Si tous les modules vont dans /home/runtime/SVN/, on peut créer un nouveau module 'foobar' avec
svnadmin create /home/runtime/SVN/foobar
  • Pour travailler dessus, il faut ensuite le checkouter pour de vrai
svn checkout svn+ssh://dalton/home/runtime/SVN/foobar

Subversion à travers un proxy

En fait, il faut éditer le fichier /.subversion/servers et mettre dans la section [global] :

[global]
http-proxy-host=www.mon-proxy.truc #mettre le bon proxy
http-proxy-port=3128  #mettre le bon port

Coté Serveur What if I'm behind a proxy?

The Subversion client can go through a proxy, if you configure it to do so. First, edit your "servers" configuration file to indicate which proxy to use. The files location depends on your operating system. On Linux or Unix it is located in the directory "~/.subversion". On Windows it is in "%APPDATA%\Subversion". (Try "echo %APPDATA%", note this is a hidden directory.)

There are comments in the file explaining what to do. If you don't have that file, get the latest Subversion client and run any command; this will cause the configuration directory and template files to be created.

Next, you need to make sure the proxy server itself supports all the HTTP methods Subversion uses. Some proxy servers do not support these methods by default: PROPFIND, REPORT, MERGE, MKACTIVITY, CHECKOUT. In general, solving this depends on the particular proxy software. For Squid, the config option is

#  TAG: extension_methods
#       Squid only knows about standardized HTTP request methods.
#       You can add up to 20 additional "extension" methods here.
#
#Default:
# none
extension_methods REPORT MERGE MKACTIVITY CHECKOUT

(Squid 2.4 and later already knows about PROPFIND.)

See also "What are all the HTTP methods Subversion uses?" for advice on additional HTTP methods to allow through your proxy.

If it's difficult or impossible to get the proxy to allow Subversion traffic, but you want to check out the Subversion sources, you may be able to go around the proxy. Some proxies that filter port 80 nevertheless allow anything on port 81. For this reason, the svn.collab.net repository server listens on port 81 as well as on port 80. Try:

svn checkout http://svn.collab.net:81/repos/svn/trunk subversion

and maybe the proxy will let you through. Another strategy is to attempt the checkout over SSL, which many proxies allow:

svn checkout https://svn.collab.net/repos/svn/trunk subversion

Of course, your svn client will have to have been built with ssl support; just pass --with-ssl to Subversion's ./configure script. You can check to see whether the 'https' scheme is supported by running svn --version.

Le serveur

création d'un dépot

  • Création du répertoire de base pour les futurs dépôts ("repository") est /var/svn
mkdir /var/svn
  • créez un dépôt
svnadmin create /var/svn/projet1
  • Création des utilisateurs

Editer les fichiers de configuration (pour choisir mot de passe et autres) dans le répertoire créé (nous considérerons le dépôt projet1). Dans le répertoire /var/svn/projet1/conf/ il faut éditer le fichier svnserve.conf avec au minimum :

     [general]
     # Les utilisateurs non auth : none/read/write
     anon-access = none
     # Les utilisateurs auth : none/read/write
     auth-access = write
     # le fichier de password
     password-db = passwd
     # Cette option spécifie l'authentification du référentiel.
     # Si deux repo ont les mêmes référentiels d'authentification, 
     # ils devraient avoir le même mot de passe de base de données, et vice versa.
     # Le domaine par défaut est le référentiel uuid.
     realm = projet1
  • Editer le fichier passwd
     [users]
     # nom   =  mot de passe
     joeuser = joepassword
     jayrandom = randomjay

(interdire l'accès en lecture à tout le monde)

  • Lancer le serveur
svnserve -d -r /var/svn
  • Automatiser le lancement de SVN
addgroup svn --system
adduser svn --system --home /var/svn --no-create-home --ingroup svn
chown -R svn: /var/svn
  • script /etc/init.d/svnserve
#!/bin/sh
set -e
if [ -x /usr/bin/svnserve ] ; then
   HAVE_SVNSERVE=1
else
   echo "Svnserve not installed."
   exit 0
fi
 . /lib/lsb/init-functions
 case "$1" in
   start)
       log_action_begin_msg "Starting SVN server"
       /sbin/start-stop-daemon --start --chuid svn:svn --exec /usr/bin/svnserve -- -d -r /var/svn
       log_action_end_msg $?
       ;;
   stop)
       log_action_begin_msg "Stopping SVN server"
       /sbin/start-stop-daemon --stop --exec /usr/bin/svnserve
       log_action_end_msg $?
       ;;
   force-reload|restart)
       $0 stop
       $0 start
       ;;
   *)
       echo "Usage: /etc/init.d/svnserve {start|stop|restart|force-reload}"
       exit 1
       ;;
esac
exit 0
chmod +x /etc/init.d/svnserve
  • runlevel
update-rc.d svnserve defaults

Utile

Garder l'historique des changements de /etc grâce aux outils de suivi de version (svn, svk)

http://www.silecs.info/tuto/html/versionnage_etc.html

Outils personnels