2011-01-24 3 views
29

Dans Subversion, j'ai créé une branche à partir d'un tronc à l'aide de svn copy. Selon le SVN 1.5 manual, "C'est le moyen le plus simple de" marquer "une révision dans votre dépôt-svn juste copier cette révision (habituellement HEAD) dans votre répertoire de balises."Comment comparer une branche à un tronc dans Subversion?

svn copy file:////svn/projectX/trunk file:///svn/projectX/branches/stefanl 

Ensuite, je fais mes modifications à la branche stefanl. Je veux commettre mes changements au tronc, mais avant que je fais cela je voudrais voir un diff des changements.

Comment différencier la branche 'stefanl' de la branche 'tronc'? J'ai essayé svn diff, mais il n'a pas fourni beaucoup d'informations:

% svn diff file:////svn/projectX/trunk file:///svn/projectX/branches/stefanl 
Property changes on: . 
___________________________________________________________________ 
Modified: svn:mergeinfo 
    Reverse-merged /trunk:r1699-1870 
+0

Cela devrait fonctionner. Avez-vous définitivement engagé vos changements dans votre agence? Demandez-vous si vous pouvez comparer votre copie de travail à une autre succursale? – Rup

+1

@Rup: J'ai engagé mes modifications dans la branche 'stefanl'. Maintenant, je veux fusionner la branche 'stefanl' dans le coffre. Mais avant de faire cela, je veux prévisualiser les changements. Je pensais que 'svn diff' montrerait toutes les différences entre le tronc et ma branche, mais ce n'est pas le cas. –

+1

@Stevan: 'svn diff' * indique * les différences entre branches lorsqu'elles sont utilisées comme ça. Le fait qu'il ne vous montre aucun moyen, il n'y en a pas. Examinez la sortie de 'svn log -v fichier: /// svn/projectX' pour voir ce qui s'est passé, spécifiquement pour voir dans quelle branche vous avez validé les modifications que vous attendiez. –

Répondre

6

Vous pouvez Unix diff pour comparer les répertoires.

Pour rechercher les fichiers manquants:

diff -r svn/projectX/trunk svn/projectX/branches/stefanl | grep -i only 

Pour trouver quelles sont les différences entre les fichiers:

diff -ru svn/projectX/trunk svn/projectX/branches/stefanl 

J'ai eu la même question et a trouvé la suggestion dans un thread mail: http://svn.haxx.se/users/archive-2003-08/0538.shtml

+0

Oui, celui-ci. La principale chose qui manquait dans la question initiale était le drapeau '-r' (récursif). Le drapeau 'u' dans le second exemple montré ici change simplement le type de sortie diff. –

1

Merci pour l'info les gars, je voudrais ajouter quelque chose pour améliorer la lisibilité des résultats diff.Si vous utilisé: svn diff svn: // url: 9090/branches/PRD_0002 svn: // url: 9090/branches/TST_0003> svn_diff_filename.txt

Vous pouvez également utiliser: findstr "Index:" C: \ chemin \ svn_diff_filename .txt> svn_diff_file_list.txt

Cela vous apportera une liste lisible de fichiers qui ont des différences.

Cordialement, Kra.

1

Si vous utilisez le plug-in Subversive avec eclipse (autre ide?), Passez à la perspective d'exploration du référentiel. Dans le panneau Dépôts SVN, faites un clic droit sur n'importe quel élément et sélectionnez l'option "Comparer ...". Il devrait être intuitif à partir de là.

46

Ajout aux réponses précédentes (si vous utilisez Tortoise SVN sous Windows):

  • droit sur un dossier quelconque. Dans le menu contextuel, sélectionnez TortoiseSVN ->Repo-navigateur. Entrez votre adresse de repo dans le champ URL.
  • Accédez au premier dossier que vous souhaitez comparer. Cliquez avec le bouton droit de la souris et sélectionnez Marque pour comparaison.
  • Naviguez jusqu'au deuxième dossier. Faites un clic droit et sélectionnez URL Comparer
+3

La question ne mentionnait pas Tortoise SVN ou Windows, donc une réponse utilisant la ligne de commande SVN serait préférable. –

+0

Merci Treb. C'était un ajout utile à la conversation. – sjwarner

3

D'après les autres réponses et un peu de recherche, je l'ai écrit un script qui le fait automatiquement.

#!/bin/bash 
url=$(svn info | grep ^URL: | sed -e 's,^URL: ,,') 
root=$(svn info | grep '^Repository Root:' | sed -e 's,.*Root: ,,') 
trunk=$root/trunk 
if [[ -n "$1" && ! -e "$1" ]] 
then 
    echo "What? svn diff \"$1\"? really?" 
    exit 
fi 
svn diff $url/$1 $trunk/$1 > trunk.diff 

Vous l'exécutez juste sous la branche. Vous pouvez passer un chemin (répertoire ou fichier) et cela fonctionnera comme prévu. Si ce n'est pas le cas, cela ne fera que différencier la branche et le tronc.

+0

L'utilisation de XML le rend beaucoup plus fiable: 'svninfo() {svn info --xml | xmllint --xpath "$ 1" '/ text()' -; } ' – ceving

+0

Cela est bon si la branche a été créée à partir de la racine du référentiel. Si la branche a été créée à partir d'un sous-répertoire, cela ne fonctionnera pas. Donc, vous pouvez vouloir modifier le script pour prendre 2 arguments et dupliquer le premier argument si un seul est fourni. –

1

Utilisation:

svn diff ^/trunkUrl/fileName ^/branchUrl/fileName 

Cela vous donnera la différence entre un fichier dans la branche et le tronc.

Questions connexes