Skip to content

Subversion

En l'honneur du king of turtles

Changelog:

  • 1.8: le reintegrate est automatique dans la commande svn merge
  • 1.7: on voit les externals au lieu de voir des répertoires vides, svn patch
  • 1.5: tree conflicts, support des external, ajout des mergeinfo
  • 1.4: dry-run

Copies de branches

Petit truc trouvé en 2011 sur la version 1.6

  • On cree une branche B2 qui est la copie d'une branche B1.
  • On checkout B2 à une révision ancienne qui est dans B1 mais pas dans B2.
  • Quand on commit, on update avant, et le commit va sur la branche B1....

Externals

Un external permet de lier une librairie externe provenant d'un autre SVN avec un projet existant. Documentation

Création:

1
svn pe svn:externals vendor/

Alternatives:

  • vendor branch: utile quand c'est l'external qui "contient" le projet SVN.
  • faire des exports de la librairie et checkout le projet par-dessus: NON car lorsque l'on va tenter de commit, TOUS les fichiers de la librairie apparaitront en non-versionné
  • faire un checkout du projet et faire un export de la librairie ensuite: ne marchera pas car le projet sera déjà une working copy + voir le problème ci-dessus pour le commit

La science du merge

Record-only merge

Le record-only merge permet d'indiquer un merge comme étant réalisé dans les mergeinfo mais sans le réaliser en vrai. Uniquement utile pour réparer des mergeinfo.

1
merge --record-only

Reverse merge

Le reverse merge sert à annuler un commit sur le repository. (eh non, il ne faut pas utiliser la commande revert qui ne marche que sur des modifs locales).

  • Règle d'or: c'est juste un merge dont le range à est : (retour dans le passé)
  • Commencer par un --dry-run pour voir l'effet
  • Ne pas oublier de commiter...

Conflit sur reverse merge

On fait un reverse merge -r n:n-1, et on a un conflit:

1
2
C site/data/sql/donnees/20110909_chaine.actvation.sql
 > local édition, suppression entrante sur fusion

L'opération qui a eu lieu en incoming pour SVN est une suppression. MAIS on est dans le cas d'un reverse merge, on retourne donc dans le passé. Est-ce que l'opération originale est réellement une suppression ? Ou une addition ?

Réponse: regarder dans le SVN log pour vérifier. Dans l'exemple donné, il s'agit d'une addition. Ce qui est inversé par retour vers le passé par une suppression. SVN est donc malin, il indique la bonne opération vue de la direction temporelle choisie !

Three way merge

Utilisé dans le cas d'une mise à jour de vendor branch. On veut appliquer les différences entre l'ancienne version et la nouvelle version sur une working copy qui utilise le vendor

  • Branche de l'ancienne version vendor: /branch/1.0
  • Branche de la nouvelle version vendor: /branch/1.1
  • Répertoire où l'on développe sur le trunk avec le vendor: workingcopy/vendor

La commande est : svn merge url://branch/1.0 url://branch/1.1 workingcopy/vendor

Ignore

1
svn ps svn:ignore '*' directory/
* on ne peut mettre qu'un pattern en 2e paramètre. Pas de nom de répertoire * on peut indiquer . si on est dans le répertoire auquel on veut faire porter l'ignore. On peut aussi indiquer un répertoire autre. Attention, la propriété sera portée par le directory visé et pas par le directory dans lequel on a lancé la commande. * Pour voir les fichiers ignorés: svn st --no-ignore

Export

La commande svn export permet de sortir les fichiers d'une working copy svn (sans les fichiers .svn). Super, mais il y a d'autres règles :

  • les fichiers qui ne sont pas versionnés ne sont pas exportés
  • si un fichier versionné a été modifié sans être commité, alors il est exporté dans sa version working copy