Subversion

De bricosoft
(Redirigé depuis Svn)
Aller à la navigation Aller à la recherche
Fichier:Subversion.png
<google uid="C08" position="right"></google>
Erreur dans le widget Twitter Search: unable to write file /home/gbp4dt5/zones/bricosoft.com/www/extensions/Widgets/compiled_templates/wrt69741732b84ae0_37936358

Subversion est un outil de gestion de versions. Ce n'est pas pour le grec et le latin mais pour l'ingénierie logicielle (tadaaa).

Cette page concerne l'installation d'un serveur svn.

Installation

$ sudo apt-get install subversion

Creation d'une repo :

$ svnadmin create ~/depots

Droits :

$ vim ~/depots/conf/svnserve.conf
anon-access = none
auth-access = write
$ vim ~/depots/conf/passwd
jujube = totoche

Lancer le serveur :

$ sudo svnserve -d -r depots

Premier ajout de sources :

svn import -m "mon premier import" chemin/mes_projets svn://localhost/mes_projets

Ne pas créer ~/depots/mes_projets, l'import va le créer.

Authentication realm: <svn://localhost:3690>
Password for 'utilisateur': 
-----------------------------------------------------------------------
ATTENTION!  Your password for authentication realm:
 ...
can only be stored to disk unencrypted!  You are advised to configure
your system so that Subversion can store passwords encrypted, if
possible.  See the documentation for details.

You can avoid future appearances of this warning by setting the value
of the 'store-plaintext-passwords' option to either 'yes' or 'no' in
'/home/utilisateur/.subversion/servers'.
-----------------------------------------------------------------------
Store password unencrypted (yes/no)? yes
....

Vérification (ailleurs dans un autre dossier):

$ svn co svn://localhost/mes_projets verif_checkout_de_mes_projets

déplacement d'une machine à une autre

C'est dans le cas où vous souhaitez déplacer votre serveur SVN vers un autre endroit (généralement une autre machine) :

Depuis l'ancienne machine vous faites un dump :

ancienne_machine:~$ svnadmin dump /srv/datas/depots > ~/depots
  • Dumped revision 0.
  • Dumped revision 1.
  • Dumped revision 2.
  • Dumped revision 3.

...

  • Dumped revision 1666.

Sur la nouvelle vous récupérez ce dump, puis vous l'importer dans votre nouveau serveur :

nouvelle_machine:~$ scp toto@ancienne_machine:depots import/
depots                             100%   61MB 617.3KB/s   01:37
nouvelle_machine:~$ svnadmin load ~/depots < ~/import/depots
...
------- Révision 1666 propagée (commit) >>>
nouvelle_machine:~$

En production

<google uid="C06" position="left"></google>

Mes sites-enabled ont des Directory qui pointent vers une copie de travail (svn co ...) mais les .svn/ sont accessibles depuis le web.

# vim /etc/apache2/conf.d/virtual-host.conf

Rajoutez :

RedirectMatch 404 .*/\.svn(/|$)

L'accès à .svn ou sous-repertoires retournera une erreur de page "non trouvée" (un éventuel attaquant ne pourra pas savoir qu'ils existent).

svn:externals

Cherchez pas plus loin, svn:externals vous évitera de perdre du temps. Et comme temps == argent == femmes, vous allez devenir un tombeur (non garanti).

(facultatif) Dans votre working copy :

mkdir vendor
cd vendor/
svn propedit svn:externals .
VendorLib/ http://svn.vendor.org/trunk/VendorLib/
svn up
svn ci -m "+VendorLib"

Autre exemple en une seule commande (ici avec le versatile Zend Framework) :

$ pwd
/home/totoche/mes_projets/my_killer_app/library

Vous souhaitez avoir dans library/ le dossier Zend/ et tous ses objets : Zend/View.php, Zend/Json.php, Zend/Feed.php, etc

$ svn propset svn:externals "http://framework.zend.com/svn/framework/standard/trunk/library/Zend Zend" .
Propriété 'svn:externals' définie sur '.'
$ ls
My

Vous allez vous dire : "quels boulets chez bricosoft.com, faut créer le dossier Zend avant FFS!". Ben nan je vous arrête, palsembleu ! Faites juste un update.

$ svn update
Récupération de la référence externe dans 'Zend'
A    Zend/File
A    Zend/File/Transfer
A    Zend/File/Transfer/Adapter
...
$ ls
My Zend

Dans le cas ou il y a plusieurs externals :

$ svn propset svn:externals -F /path/to/externals.txt ton_dossier/
$ cat /path/to/externals.txt
lib-alacon http://svn.chez.quelqu.un/svn/trunk/lib-alacon
lib-tronulle http://svn.chez.un-autre-con.ar/svn/trunk/lib-tronulle
...


preggo.

svn ignore ou comment ignorer répertoire ou fichier dans subversion

<google uid="C06" position="left"></google>

dossier ou répertoire

Un peu comme le /ignore d'IRC, ça permet de ne plus voir le contenu d'un dossier :

$ svn propset svn:ignore file .

Il faut se mettre dans le dossier concerné, pas plus haut, pas plus bas.

Utile pour les cache/ tmp/ uploads/ qui changent souvent, sont volumineux ou n'offre aucun intérêt à être historisés.

un fichier par extension

Pour ignorer un fichier il faut rajouter un filtre d'amour de désamour :

$ svn propset svn:ignore ".htaccess" .
Propriété 'svn:ignore' définie sur '.'

Autre exemple, ignore les fichiers .bak :

$ svn propset svn:ignore "*.bak" .

liste à ignorer

ou sur des extensions de fichiers, tu [ crées] une liste que tu sauvegardes dans medias.txt par exemple :

$ cat medias.txt
*.avi
*.mpg
*.jpg
*.png
$ svn propset svn:ignore -F medias.txt .
Propriété 'svn:ignore' définie sur '.'

méthode interactive, ignorez plusieurs fichiers, répertoires, dossiers et liens

propedit va vous ouvrir nano ou votre éditeur préféré, à vous de rajouter les fichiers ou dossiers à ignorer

svn propedit svn:ignore .

Mettez un fichier par ligne (un + saut de ligne) pour constituer une liste de fichiers ignorés.

vérifier les fichiers en svn:ignore

$ svn status | grep '^\?' | awk '{print $2}'
cache/fa96f0ca12d43962013d0415e43b9d3e.cache
cache/28ceeb9daa2b1a374d4e002b71181da5.cache
cache/41d2c678d5e204a29ffbf78346970bea.cache

:-(

Pour définitivement les enlever de subversion :

$ svn status | grep '^?' | sed -e 's/^? */svn add "/g' -e 's/$/"/g'|sh ; svn status | grep '^!' | sed -e 's/^! */svn delete "/g' -e 's/$/"/g'|sh
A         cache/03cf52435d1e852f6085ace5e8756420.cache
A         cache/dde97ca56a4a9c266cb22417d19952ae.cache
A         cache/d482e5984231adb9986ad016c2d05ae7.cache
D         cache/7da1ff5d3498c3b5eb7018eb8059c84e.cache
D         cache/182c69fdccd552edcb997dffbe41a28e.cache
D         cache/01a285e92cfaaf36df302e3d0c5e12b3.cache

ignorer tous les *.truc partout partout partout

Dans ton arbo de projet, ça va ignorer tous les *.truc :

svn propset svn:ignore '*.truc' . --recursive

Ou plus concis mais obscur au néophyte :

svn propset svn:ignore '*.truc' . -R

ignorer un truc déjà versionné

svn delete truc

svn propset svn:ignore truc .

problèmes et erreurs courantes

Eclispe et .project

Effacer un .project committé par erreur et qui flingue l'import (New Project from SVN dans Eclispe) :

svn del http://svn.myserver.fr/svn/module/trunk/.project

ou :

svn del svn://svn.myserver.fr/svn/module/trunk/.project

405 Method Not Allowed

Si t'as eu le serveur a envoyé une valeur inattendue (405 method not allowed), remplace le protocole http par le bon svn :

$ svn co http://bricosoft.com/projects/killerapp
svn: Le serveur a envoyé une valeur inattendue (405 Method Not Allowed) en réponse à la requête PROPFIND pour '/projects/killerapp'

Avant d'utiliser directement le protocole http:: c'est que t'as ptet pas configuré le webDAV. Directement en svn: ça ira mieux :

$ svn co svn://bricosoft.com/projects/killerapp
A    killerapp/www
A    killerapp/www/tests
A    killerapp/www/application

Others 405 Method Not Allowed : helmutgranda.com

Cible explicite requise ('totoche' interprété comme valeur de propriété)

T'as oublié d'indiquer à quel dossier(+sous dossiers) s'applique la règle. Exemple avec propset

$ svn propset svn:ignore "default*"
svn: Essayer 'svn help' pour plus d'information.
svn: Cible explicite requise ('default*' interprété comme valeur de propriété)

Il faut indiquer le dossier :

$ svn propset svn:ignore default /etc/apache2/sites-available

Ou si t'es dedans :

$ svn propset svn:ignore "default*" .


svn: Arrêt de la propagation : '/irak' demeure en conflit

$ svn ci -m " "
svn: Échec de la propagation (commit), détails :
svn: Arrêt de la propagation : '/irak' demeure en conflit

C'est balo, et bim ! :

$ svn resolved *
$ svn ci -m " "
...
Révision 610 propagée.

svn export

Dans l'exemple d'une arborescence versionnée donc remplie de .svn/ vous souhaitez copier tous ces fichiers sur votre serveur web.

A la racine de votre arbo remplie de .svn :

$ svn export . dossier_temporaire
Fin d'exportation.

Copier votre arbo nettoyée vers le serveur :

$ cd dossier_temporaire
$ scp -r * root@google.fr:/home/google.fr/

Il y a une alternative si cet export déconne : rsync -aC src dest

$ rsync -avvC ready-to-roll-out/ destination/move-it/

use the force

Pour forcer l'export à écrabouiller le dossier de destination :

$ sudo svn export . --force /etc/apache2/sites-available/
Fin d'exportation.

1337 Scripts

dans une working copy, la 1ere colonne donne le nombre de commits :

$ svn log -q|grep "|"|cut -d"|" -f 2|sort|uniq -c|sort -nr
992  uber1337dev
103  1337dev
 30  dev 
  9  n00b

install :

$ echo 'topdevs() { svn log -q|grep "|"|cut -d"|" -f 2|sort|uniq -c|sort -nr; }' >> ~/.bash_aliases
$ . ~/.bash_aliases
$ topdevs
666 c0d3b33th0ven
  2 y0urM0m

Le top des dev d'aujourd'hui :

$ svn log -r {`date "+%Y-%m-%d"`}:HEAD|grep '^r[0-9]' |cut -d\| -f2|sort|uniq -c
     1  nolifedev
     1  devdev

retrouver les bidules hors SVN

Des fichiers, dossiers trainent parfois et ne sont pas versionnés, cette commande permet de les débusquer :

$ svn status | grep "^\?" | awk '{print $2}'
.project

Effacer tous les repertoires .svn

Effacer tous les repertoires .svn :

$ find . -type d -name .svn -delete

ou :

$ find . -name .svn  -exec rm \-rf {} \;

hooks

en cours ...

Sources