Subversion
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
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
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
top developers
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 ...
- http://www.codersrevolution.com/index.cfm/2008/9/15/Creating-a-postcommit-hook-for-Subversion
- http://maymay.net/blog/2007/06/21/a-better-expect-subversion-post-commit-hook/