2008-12-31 11 views
22

Ich benutze SVN als das Quellcodeverwaltungssystem, und ich frage mich, wie man Verzeichnisse vergleicht und Metadatenunterschiede ignoriert. Gibt es eine Möglichkeit, svn diff mitzuteilen, nur den tatsächlichen Inhalt zu vergleichen und Metadaten zu ignorieren?Gibt es einen Metadaten-Ausschlussfilter für den SVN-DIFF-Befehl?

Ich meine Metadaten wie SVN-Eigenschaften, etc., die den Dateiinhalt nicht beeinflussen. Angenommen Datei X hat eine zusätzliche Eigenschaft in Zweig B im Vergleich zu Trunk T. Leider wird es in 'svn diff T B' angezeigt, obwohl der tatsächliche Inhalt der Datei X derselbe ist.

Ich suche etwas wie folgt aus:

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

Update: ich diese teilweise gelöst, indem direkt auf dem Dateisystem diff'ing stattdessen die SVN-Tools zu verwenden. Siehe meine eigene Antwort unten ...

+0

Was meinst du mit Metadaten? – codelogic

+0

"SVN Eigenschaften" ist ein besseres Wort, um es zu beschreiben. Ich habe meinen Beitrag repariert, um dies zu klären. – driAn

+0

Wenn Sie eine Lösung finden, bitte posten Sie es, ich bin gespannt, wie das gemacht würde. Vielleicht hat GIT diese Funktion ... –

Antwort

3

Es scheint keine Möglichkeit zu geben, dies mit den integrierten svn-Tools zu erledigen. Wie ich es gelöst habe: Exportieren Sie beide Bäume und diff direkt auf dem Dateisystem mit Ihrem Lieblings-Diff-Tool. Das ist irgendwie der einzige Weg, dies zu erreichen:/

0

Ich bin mir nicht sicher, aber ein einfaches 'svn diff | grep -iv "Zeug zum Ignorieren" wäre ein Workaround.

+1

Das ganze diff kommt nur als eine riesige Menge an Text, ich müsste es manuell analysieren, um alle 'svn property added'-ähnlichen Änderungen herauszufiltern. Keine leichte Aufgabe, die ich leider mit grep erledigen kann. – driAn

-6

Sie können die Eigenschaft svn:ignore für Dateien und Verzeichnisse festlegen, die svn diff ignorieren soll.

+1

Ich möchte bestimmte Verzeichnisse oder Dateien nicht ignorieren, es geht darum, unterschiedliche Eigenschaften (aka Metadaten) der gleichen Dateien zu ignorieren. Angenommen, Datei X hat eine zusätzliche Eigenschaft in Zweig B im Vergleich zu Trunk T. Sie wird in svn diff angezeigt, obwohl der tatsächliche Inhalt derselbe ist. – driAn

10

Wenn Sie die Option --summarize verwenden, dann werden Eigenschaftenänderungen in der zweiten statt in der ersten Spalte angezeigt.

D.h.

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

Es ist ein bisschen leichter zu grep. Ich denke, dass Sie einen zweistufigen Prozess haben könnten, wenn Sie ein vollständiges diff möchten - verwenden Sie zuerst summarize, um Dateien mit Inhaltsänderung zu finden, und dann diff.

5

Schöner Tipp von JosephWatkins. Hier

ist der Befehl für den grep-junior-Benutzer:

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

Der grep sucht einen Raum als das zweite Zeichen auf der Linie.

+2

Entschuldigung. Es muss sein svn diff A B --summize | grep -v '^' Alle Zeilen, die mit einem Leerzeichen beginnen, müssen ausgeblendet sein, da nur Eigenschaften für Dateien geändert werden. –

+0

Dies behandelt keine Fälle, in denen Dateiinhalt * und * Eigenschaften geändert werden oder wo etwas anderes, wie Sperren, mit der Datei passiert ist und die Datei geändert wurde. – trysis

1

Ich schrieb ein Skript, um dies zu tun, nachdem ich online nicht finden konnte.

Das Skript entfernt die Daten basierend auf einem Array von regulären Ausdrücken, die am Anfang des Skripts eingegeben wurden. Derzeit ist es so eingerichtet, dass die Änderungen der Eigenschaften herausgefiltert werden. Es kann jedoch jede Änderung entfernen, die einer Reihe regulärer Ausdrücke entspricht.

Passen Sie einfach die Ausgabe von svn diff an das Skript an, nachdem Sie das Skript festgelegt haben. Ich habe die Filter anstelle von Parametern in das Skript eingefügt, weil ich immer dieselben Filter verwende.

Ich veröffentlichte es als GPLv2.

clean_svn_diff.bash

21

Sie können die svn diff Ausgabe über ‚filterdiff --clean‘ passieren alle überflüssigen Linien einschließlich Eigenschaftsänderungen zu entfernen.

+0

Arbeiten wie angekündigt - großartig! Ein Hinweis für Debian/Ubuntu-Benutzer: Wenn 'filterdiff' nicht auf Ihrem System ist, können Sie es über' apt-get install patchutils' installieren. –

2

Hier ist ein einziger Befehl, der all dies tut. Angenommen, Sie mögen alle (nicht-Eigenschaft) diffs für alle Dateien im aktuellen Verzeichnis zwischen Revision 54833 und 57215. Mit diesem Befehl finden sollte es tun:

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

NB: Es ist nur Diffs modifizierte Dateien - nicht hinzugefügt oder gelöscht Dateien.

1

Fand dieses während der Suche durch die svn help docs

svn diff --patch-compatible 

Es ist das gleiche wie läuft

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