Utilisation du dépôt Subversion en tant que développeur / contributeur identifié

Cette page se veut un résumé rapide des manipulations relatives au dépôt Subversion qu'un contributeur au projet QElectroTech peut être amené à effectuer. La bible sur Subversion reste toutefois le SVN Book

Faire un check out

Check out anonyme

svn checkout svn://svn.tuxfamily.org/svnroot/qet/qet/trunk qelectrotech_trunk

Check out identifié

Un check out permet de créer une copie local (on parle de “working directory”) d'un dossier présent dans le SVN (typiquement pour QET : le trunk ou la branche 0.3). Utilisez les commandes ci-dessous en remplaçant identifiant par votre login. La connexion passant par SSH, le mot de passe est généralement demandé 3 fois à chaque opération (svn checkout, commit, up, …). Voir la FAQ TuxFamily pour automatiser l'identification via une clé SSL.

# Check Out du trunk
svn co "svn+ssh://identifiant@svn.tuxfamily.org/svnroot/qet/qet/trunk" qelectrotech_trunk
# Check Out de la branche 0.3
svn co "svn+ssh://identifiant@svn.tuxfamily.org/svnroot/qet/qet/branches/0.60" qelectrotech_0.60
 
svn co "svn+ssh://identifiant@svn.tuxfamily.org/svnroot/qet/qet/branches/DXFtoQET3_DB" DXFtoQET3_DB

Je me suis gouré, j'ai fait un check out anonyme

Rendez-vous dans votre dossier de travail Subversion et utilisez les commandes suivantes :

svn_user=votre_identifiant_ici
find . -type f -name entries -exec sed -i "s,svn://svn.tuxfamily.org,svn+ssh://${svn_user}@svn.tuxfamily.org,g" {} \;
svn up

Mettre à jour son répertoire de travail

svn up

Les fichiers mis à jour sont alors affichés précédés par une lettre représentant l'état de la mise à jour :

  • A : fichier ajouté
  • D : fichier supprimé
  • U : fichier mis à jour sans problème
  • G : fichier modifié dans votre répertoire de travail et mis à jour sans conflit
  • C : fichier modifié dans votre répertoire de travail mais dont la mise à jour entre en conflit avec les modifications locales

Gérer ses modifications

Il est possible de lister les fichiers modifiés avec la commande :

svn status

L'affichage est le même que lors d'un svn up. Les fichiers peuvent être ajoutés au versionnement via svn add puis manipulés via svn mv, svn cp et svn rm. Les modifications peuvent être visualisés via svn diff ; exemple :

svn diff sources/qetproject.h
Index: sources/qetproject.h
===================================================================
--- sources/qetproject.h        (révision 449)
+++ sources/qetproject.h        (copie de travail)
@@ -21,7 +21,9 @@
 #include <QtXml>
 class Diagram;
 class ElementsCollection;
+class ElementsCategory;
 class XmlElementsCollection;
+class MoveElementsHandler;
 /**
        Cette classe represente un projet QET. Typiquement enregistre dans un
        fichier, il s'agit d'un document XML integrant des schemas ainsi qu'une

Il est également possible de visualiser les différences sur les fichiers texte de manière conviviale avec Kompare et ce petit script.

Dernière alternative :

svn diff | colordiff | less -R

Autres commandes utiles :

  • svn export : même utilité que co / checkout, mais le résultat obtenu n'est pas un répertoire de travail Subversion (= il n'y a pas de sous-dossiers .svn) ; cela permet de faire une simple extraction d'une arborescence du dépôt
  • svn cat : prend en paramètre une liste de fichiers (y compris directement dans le dépôt) et affiche leur contenu sur la sortie standard.
  • svn revert : restaure l'état d'un fichier (les modifications locales sont perdues au profit de l'état du fichier dans le dépôt Subversion)
  • svn resolved : marque un fichier en conflit (état C) comme étant résolu.
  • svn blame : permet de savoir, pour une liste de fichiers données, qui est l'auteur de chaque ligne.
  • svn merge : prend trois arguments, fait un diff entre les deux premiers et l'applique au troisième. À utiliser pour la gestion avancée des branches.
  • svn info : affiche des informations sur le répertoire de travail courant
  • svn help : apporte de l'aide sur une commande

Envoyer ses modifications

Une fois les modifications terminées et dignes de figurer dans le dépôt Subversion, il faut les commiter. Avant de commiter, il est recommandé de faire un dernier svn up, pour s'assurer que des modifications n'ont pas été faites par un autre contributeur entretemps. Un commit doit être accompagné d'un message de commit ; exemple :

svn ci -m "Correction d'un bug qui empechait la fermeture d'un projet ne comportant aucun schema."

Il est toutefois recommandé d'effectuer un simple svn ci, qui utilisera l'éditeur mentionné dans la variable d'environnement $EDITOR pour éditer un fichier comprenant :

  • une zone pour écrire le message de commit
  • une zone listant les fichiers qui vont être commités

Cela permet de vérifier une dernière fois le contenu du commit. Si le fichier n'est pas modifié (:q! dans vim), svn donnera la possibilité d'abandonner le commit. Sinon, le commit est effectué après enregistrement du fichier et fermeture de l'éditeur (:x dans vim).

Correction d'un bug qui empechait la fermeture d'un projet ne comportant aucun schema.

--Cette ligne, et les suivantes ci-dessous, seront ignorées--
M    sources/diagramview.cpp
M    sources/qetproject.h
M    sources/qetproject.cpp

Note : pour diverses raisons, merci d'éviter les caractères accentués ou spéciaux dans les messages de commit.

Modifier un message de commit

Modifier un message de commit implique d'être l'administrateur du dépôt Subversion ⇒ demander à Xavier.

#!/bin/bash
 
REV="$1"
REPOS_URL="file:///home/xav/qet"
REPOS_PATH="qet"
TMP_FILE="commit_message"
 
# recupere le message actuel
svn log -r "${REV}" "${REPOS_URL}" | tail -n +3 | grep -v -- '----' > "${TMP_FILE}"
vim "${TMP_FILE}"
 
echo -n "Modifier (y/n) ? "
read answer
[ "${answer}" == "n" ] && exit 0
svnadmin setlog "${REPOS_PATH}" -r "${REV}" "${TMP_FILE}"
 
echo "Message de la revision ${REV} apres modification :"
svn log -r "${REV}" "${REPOS_URL}"
Imprimer/exporter