2008-12-31 5 views
22

J'utilise SVN comme système de contrôle de la source, et je me demande comment comparer les répertoires en ignorant les différences de métadonnées. Existe-t-il un moyen de dire à svn diff de ne comparer que le contenu réel et d'ignorer les métadonnées? Je veux dire des métadonnées comme les propriétés SVN, etc. qui n'affectent pas le contenu du fichier. Supposons que le fichier X possède une propriété supplémentaire dans la branche B par rapport au tronc T. Malheureusement, il apparaîtra dans 'svn diff T B' même si le contenu réel du fichier X est le même.Existe-t-il un filtre d'exclusion de métadonnées pour la commande SVN DIFF?

je cherche quelque chose comme ceci:

svn diff https://example.org/tags/v1 https://example.org/tags/v2 -x -ignore-metadata --summarize 

Mise à jour: Je résolu partiellement par ce diff'ing directement sur le système de fichiers au lieu d'utiliser les outils SVN. Voir ma propre réponse ci-dessous ...

+0

Que voulez-vous dire par métadonnées? – codelogic

+0

"Propriétés SVN" est un meilleur mot pour le décrire. J'ai corrigé mon post pour clarifier cela .. – driAn

+0

Si vous trouvez une solution s'il vous plaît poster, je suis curieux de savoir comment cela serait fait. Peut-être que GIT a cette fonctionnalité ... –

Répondre

3

Il semble y avoir aucun moyen d'y parvenir en utilisant les outils intégrés svn. Comment je l'ai résolu: Exporter les deux arbres et les différer directement sur le système de fichiers en utilisant votre outil de diff favori. C'est en quelque sorte la seule façon de faire cela:/

0

Je ne suis pas sûr, mais un simple 'svn diff | grep -iv "trucs à ignorer" serait une solution de contournement.

+1

Le diff entier vient seulement comme une énorme quantité de texte, je devrais l'analyser manuellement pour filtrer toutes les modifications «svn property added». Pas de tâche facile, je peux le faire en utilisant grep malheureusement. – driAn

-6

Vous pouvez définir la propriété svn:ignore sur les fichiers et les répertoires que vous souhaitez que svn diff ignore.

+1

Je ne veux pas ignorer des répertoires ou des fichiers spécifiques, il s'agit d'ignorer les propriétés différentes (aka métadonnées) des mêmes fichiers. Supposons que le fichier X possède une propriété supplémentaire dans la branche B par rapport au tronc T. Il apparaîtra dans svn diff même si le contenu réel est le même. – driAn

10

Si vous utilisez l'option --summarize, les changements de propriétés sont indiqués dans la seconde colonne plutôt que dans la première.

à savoir,

M URL -- indicates content change 
M URL -- property change 
MM URL -- content and property change 

Il est un peu plus facile à grep. Je suppose que vous pourriez avoir un processus en deux étapes si vous voulez un diff complet - la première utilisation résume pour trouver des fichiers avec le changement de contenu, puis les diff.

5

Bon conseil de JosephWatkins.

Voici la commande pour les utilisateurs grep-junior-:

svn diff A B --summarize | grep '^. ' 

Le grep cherche un espace comme le second caractère sur la ligne.

+2

Désolé. Ce doit être svn diff A B --summarize | grep -v '^' Toutes les lignes commençant par un espace doivent être cachées, car là où seule la propriété change sur les fichiers. –

+0

Cela ne gère pas les cas où les propriétés de contenu de fichier * et * sont modifiées, ou si quelque chose d'autre, comme le verrouillage, est arrivé au fichier et que le fichier est modifié. – trysis

1

J'ai écrit un script pour le faire, après que je ne pouvais pas en trouver un en ligne.

Le script supprime les données en fonction d'un tableau d'expressions régulières entré en haut du script. Actuellement, il est configuré pour filtrer les changements de propriétés, mais il peut supprimer toute modification qui correspond à une série d'expressions régulières.

Juste dirigez la sortie de svn diff vers le script, après avoir défini le script. Je place les filtres dans le script à la place des paramètres car j'ai toujours les mêmes filtres.

Je l'ai publié en tant que GPLv2.

clean_svn_diff.bash

21

Vous pouvez passer la sortie de svn diff par « filterdiff --clean » pour supprimer toutes les lignes étrangères, y compris les changements de propriété.

+0

Travailler comme annoncé - super! Un conseil pour les utilisateurs de Debian/Ubuntu: si 'filterdiff' n'est pas sur votre système, vous pouvez l'installer via' apt-get install patchutils'. –

2

Voici une seule commande qui fait tout cela. Dites que vous voulez trouver tous les (non-propriété) diffs pour tous les fichiers du répertoire actuellement entre la révision 54833 et 57215. Cette commande devrait le faire:

svn diff -r 54833:57215 --summarize | egrep -v '^ |^D|^A' | awk '{ print $2 }' | xargs svn diff -r 54833:57215 

NB: Il uniquement les fichiers modifiés de diffs - non ajoutés ou supprimés des dossiers.

1

trouvé ce tout en cherchant à travers les aide svn docs

svn diff --patch-compatible 

C'est la même que celle qui

svn diff --show-copies-as-adds --ignore-properties 
Questions connexes