2 votes

Subversion : extraction de diff+log et relecture

Je me trouve dans la situation où un client nous a fourni un ordinateur que je peux utiliser pour me connecter en VPN à son réseau afin d'accéder à son repo SVN. Mais comme nous ne pouvons pas tous développer sur cet ordinateur, nous avons exporté "notre branche" et l'avons importée dans notre propre repo SVN. Comme le client ne se préoccupe pas vraiment de notre travail quotidien, nous prévoyons de déposer simplement de gros jeux de modifications à des moments opportuns. Tout cela fonctionnera, j'en suis sûr.

Dernièrement, je me suis demandé s'il existait un moyen simple de récupérer les jeux de modifications (c'est-à-dire diff + message) de notre SVN, puis de les rejouer dans le SVN du client. Un peu comme dans le cas de git format-patch y git am permet.

En regardant svn log --diff il semble que ce soit possible, mais il faudrait que je prépare un script pour séparer la sortie en un patch (à appliquer à l'aide de svn patch ) et un message commit (à fournir à l'adresse svn commit -F ). J'espère qu'il y a une solution qui ne nécessite pas que j'écrive un tel script ;)

3voto

andrej Points 432
  1. LAST_MOVED est le dernier mouvement commit. Au début, il est égal à 0, puis il augmentera.

  2. obtenir la liste des commits :

    svn log -q -r $LAST_MOVED:HEAD | grep -o ^r[0-9]*

    cela produira quelque chose comme

    r10
    r12
    r16
    r22

  3. pour chaque REVISION, vous devez obtenir la diff :

    svn diff -c $REVISION > $REVISION.diff

    et le message commit :

    svn log -c $REVISION | tail -n -2 | head -n -1 > $REVISION.txt

    vous aurez :

    r10.diff
    r10.txt

    r12.diff
    r12.txt

    r16.diff
    r16.txt

    r22.diff
    r22.txt

  4. transférer ces fichiers sur la machine cible,

  5. courir svn update

  6. pour chaque r*.diff y r*.txt les fichiers sont exécutés :

    • patch -p0 -i r{number}.diff

    • svn commit -a -m --file r{number}.txt

Il y a un problème qui svn ne diffère pas les données binaires Les données binaires ne seront donc pas transférées par cette méthode. Pour chaque fichier binaire, vous obtiendrez

Index : path/to/file/something.jar
\===================================================================
Impossible d'afficher : fichier marqué comme un type binaire.
svn:mime-type = application/octet-stream

Vous devez détecter cette chaîne dans les fichiers de comparaison et, pour ces fichiers, vous pouvez utiliser la commande de comparaison externe décrite à la section https://stackoverflow.com/a/2255846/146745

1voto

Bayou Points 166

Je suppose que la réponse de @andrej fonctionne lorsque les messages commit ne dépassent pas une ligne de texte. Maintenant, on se retrouve avec un message commit vide :

$ svn log -c r80 test/ | tail -n 2 | head -n 1

$

Note : Je suppose que votre version de svn log a soutenu les options présentées.

Une meilleure solution consiste à rechercher les révisions à partir d'un chemin dans la racine de votre svn et d'utiliser svn log à la place. La regex est ajustée pour ne pas correspondre à un seul r au cas où vous auriez un message commit commençant par lui.

Les commandes suivantes créent des correctifs à partir des révisions qui affectent le répertoire dir :

$ dir=test/
$ svn log "${dir}" | grep -oE '^r[0-9]+' \
        | while read -r rev; do
                svn log --diff -c ${rev} "${dir}" > "${rev}-${dir/\/*/}.patch";
        done

La commande pour patcher r80-test.patch :

$ patch -p 0 < r80-test.patch

Testé avec la version 1.9.5 de svn.

0voto

andrej Points 432

obsolète, voir mon autre réponse

  1. modifier les fichiers
  2. courir svn add *
  3. courir svn diff > file.diff
  4. copier le fichier .diff sur le PC du client
  5. sur le PC client, exécuter svn update
  6. courir patch -p0 -i file.diff
  7. courir svn commit -a
  8. Profitez-en !

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X