2009-08-03 4 views
18

J'ai 2 dépôts. Comme le code de jonction se trouvait dans un référentiel, qui était protégé, j'ai effectué une extraction puis je l'ai archivé dans l'autre référentiel (les utilisateurs n'ayant pas la permission du premier dépôt protégé).SVN diff à travers 2 référentiels différents

Maintenant, le problème est que les deux dépôts ont été travaillés et nous souhaitons enfin fusionner le code/branche dans le second non protégé avec le protégé. Mais, il y aura des conflits dans ceux-ci.

Existe-t-il un moyen de connaître le diff pour les deux branches du référentiel? En outre, s'il y a des changements d'espace, comment les ignorer?

Répondre

23

Je ne sais pas d'une fonction intégrée de subversion qui permettrait, mais vous pouvez créer une caisse complète des deux référentiels et utiliser la ligne de commande diff utilitaire pour comparer les deux copies de travail:

diff -w -u -r -N WorkingCopy1 WorkingCopy2

-w à ignorer re tous les espaces blancs -u pour utiliser le format diff unifié (comme la subversion) -r pour récursive -N de laisser de nouveaux fichiers apparaissent dans le patch

Il est sûrement pas l'approche la plus rapide, mais peut-être acceptable pour un processus unique . Vous pouvez également créer un patch en redirigeant la sortie vers un fichier diff -w -u -r -N WorkingCopy1 WorkingCopy2 > wc1-to-wc2.patch

Si vous êtes fenêtres en cours d'exécution, win32 construit des diff et patch se trouve ici: http://gnuwin32.sourceforge.net/packages/diffutils.htm

+0

J'aime l'idée. Si la quantité de conflits dans le fichier attendus est faible, vous pouvez aussi faire rsync -av --ignore = '. Svn' dans les deux directions (d'abord avec -n, drapeau d'exécution à sec puis sans) – bobah

+1

suggérer ajouter --exclude = " .svn " ... ou .git .hg ... etc par exemple: diff -w -u -r -N --exclude =". svn "WorkingCopy1 WorkingCopy2 – ideasman42

+0

si vous voulez être vraiment fou: diff - w -u -r -N -x '* .pyc' --exlude = ". svn" WorkingCopy1 WorkingCopy2 | vim - –

3

Vous pouvez utiliser un outil comme kdiff3 pour comparer simplement des copies de travail extraites des deux référentiels. (Il suffit de pointer sur les deux répertoires et il va comparer récursivement tous les fichiers.)

1

Probablement la chose la plus simple est de vérifier les deux branches et utiliser un outil comme winmerge (qui vous permettra d'ignorer les espaces et faire multi comparer)

+0

Avantages à l'aide d'un outil comme winmerge ou kdiff3 sont Side- Comparaison à côté et navigation interactive (et aussi fusion, si vous en avez besoin). – apollodude217

1

Copiez le deuxième dépôt dans la première utilisant quelque chose le long de ce qui suit dans une copie de travail du premier dépôt:

svn cp svn://url/to/the/second/repo branches/second_repo 

arrivée et faire une fusion régulière de la nouvelle branche à votre tronc. Cette explication suppose que vous utilisez la disposition la plus courante du dépôt svn (branches /, tags/et/trunk comme répertoires de premier niveau) et qu'il peut être nécessaire d'adapter la commande de copie.

Notez également que certaines interfaces graphiques pour SVN prennent également en charge ce mode de copie. Dans SmartSVN, la commande s'appelle "Copier depuis l'URL".

5

Le meilleur outil pour effectuer cette fusion peut être git-svn.Si l'URL des deux référentiels sont URL1 $ et URL2 $, essayez:

 
$ git svn clone $URL1 svn1 
$ git svn clone $URL2 svn2 
$ cd svn1 
$ git fetch ../svn2 
$ git diff FETCH_HEAD master 

Pour Ne pas tenir compte des espaces, utilisez diff git -w

1

Les travaux suivants, mais il lent:

svn diff [url] [url]

27
svn diff [email protected] [email protected] 

Exemple:

svn diff --old=http://svn.whatever.com/trunk/[email protected] --new=http://svn.whatever.com/branch/[email protected] 

Ceci vous permet de spécifier à la fois les branches et les numéros de révision pour les deux fichiers. Je sais que ça marche parce que je viens de l'exécuter.

+3

C'est la bonne réponse. –

+0

+1 triés; acclamations, et tous à partir de la ligne de commande sans avoir besoin d'extras. – Rob

+0

getting 'svn: Désolé, svn_client_diff4 a été appelé d'une manière qui n'est pas encore supportée 'help master? –

0

Si vous êtes sur Linux, vous pouvez également utiliser l'outil « MELD » ... Il fait une grande diff, et vous pouvez facilement faire une fusion ...