Entfernen Sie unnötige svn: mergeinfo-Eigenschaften

136

Wenn ich Inhalte in meinem Repository zusammenführe, möchte Subversion viele svn:mergeinfoEigenschaften zu Dateien hinzufügen / ändern , die völlig unabhängig von den Dingen sind, die ich zusammenführen möchte.

Fragen zu diesem Verhalten wurden bereits hier bei Stack Overflow gestellt:

Soweit ich aus den oben genannten Themen weiß, haben viele Dateien in meinem Repository explizite svn:mergeinfoEigenschaften, wenn dies nicht der Fall sein sollte. Es wird empfohlen, die Menge zu reduzieren und diese Eigenschaften nur für relevante Dateien / Ordner bereitzustellen.

Nun also meine Frage: Wie kann ich diese nicht benötigten Eigenschaften einfach entfernen? Ich verwende TortoiseSVN, zögere jedoch, Hunderte von Dateien manuell zu überprüfen / zu reparieren. Gibt es eine einfachere Möglichkeit, diese unnötigen svn:mergeinfoEigenschaften zu entfernen ?

PS Ich suche keinen C ++ SVN API-Code.

LeonZandman
quelle

Antworten:

142

Hier ist eine andere Möglichkeit, alle svn: mergeinfo-Eigenschaften des Unterbaums zu löschen, jedoch nicht im Stammordner (dies ist erforderlich, damit die Verzweigung ordnungsgemäß funktioniert).

Von der Wurzel des Projekts aus:

svn propdel svn:mergeinfo -R
svn revert .
svn ci -m "Removed mergeinfo"
Vincent
quelle
57
Oder tun Sie es einfach nicht im Root-Verzeichnis "svn propdel -R svn: mergeinfo ./*"
JeremyWeir
3
"svn propdel -R svn: mergeinfo ./* ./.[^.‹*" Wenn Sie auch versteckte "dot" / * ix-Dateien haben, ist dies für einen Windows-Benutzer gemäß der Frage wahrscheinlich kein Problem.
Peter
3
Das Unterdrücken der Ausgabe beschleunigt es: "svn propdel svn: mergeinfo -R> nul" (oder> / dev / null unter Linux)
bebbo
2
@JeremyWeir Was meinst du mit "mach es einfach nicht im Root-Verzeichnis"? Woher dann? Sie haben viele positive Stimmen zu diesem Kommentar, aber ich sehe keine Alternative.
TT.
3
@TT. Ich denke, die Idee ist, einfach in das Verzeichnis zu gehen, das alle durcheinandergebrachten Zusammenführungsinformationen enthält, und dies von dort aus zu tun, damit Sie das Stammverzeichnis nicht zurücksetzen müssen. Sie möchten sich nicht mit der Mergeinfo der Wurzel anlegen.
JeremyWeir
15

Hier ist eine Möglichkeit, alle Eigenschaften des Teilbaums svn: mergeinfo zu löschen. Führen Sie es im Stammverzeichnis Ihres Repositorys aus:

svn propget svn:mergeinfo --depth=infinity 
    | grep -v "^/"
    | grep -v "^\."   
    | cut -d- -f1 
    | xargs svn propdel svn:mergeinfo

Alles in einer Zeile zum einfachen Kopieren / Einfügen:

svn propget svn:mergeinfo --depth=infinity | grep -v "^/" | grep -v "^\." | cut -d- -f1 | xargs svn propdel svn:mergeinfo

Um eine Vorschau der Dateien anzuzeigen, die davon betroffen sind, bevor Sie sie ausführen, ändern Sie das letzte "propdel" in "propget" oder entfernen Sie die letzte xargs-Pipe insgesamt.

Kelvin
quelle
2
Funktioniert mit Bindestrichen in Dateien: svn propget -R svn: mergeinfo | grep -v "^ /" | grep -v "^ \." | schneide "-d" -f1 | xargs svn propdel svn: mergeinfo
Eichhörnchen
12

Wie in diesem Thread erwähnt :

  • Die meisten leeren Mergeinfos ("leer") können durch Kopien / Verschiebungen von Arbeitskopien zu Arbeitskopien verursacht werden, bei denen das Quellelement keine explizite Mergeinfo enthält. Die Verwendung von propdel kann die Lösung sein, es sei denn, Sie verwenden eine 1.6-SVN: Seit 1.5.5 erstellen diese WC-zu-WC-Kopien keine leeren Mergeinfo mehr auf dem Ziel
  • Ein früherer Restrukturierungsvorgang zum Verschieben (Umbenennen) von svn kann auch mergeinfo verbreiten, anstatt sie im Stammverzeichnis zu belassen
  • Es gibt ein potenzielles Speicherproblem, das von Fall 3393 verfolgt wird und in einer kommenden Version 1.6.2 behoben und in Version 1.5 zurückportiert wird
VonC
quelle
6

Da ich mit dem svn:merge-infoLöschen von blinden Eigenschaften nicht sicher bin , habe ich ein Tool implementiert, um die aktuelle Situation auf einer Arbeitskopie zu analysieren und so viele Zusammenführungsrevisionen wie möglich aus Nicht-Root-Eigenschaften für Zusammenführungsinformationen zu entfernen. Nach zusätzlichen menschlichen Überprüfungen und Kontrollen können die Änderungen an der Arbeitskopie festgeschrieben werden.

Hier ist es: svn-clean-mergeinfo

Zögern Sie nicht, ein Problem bezüglich der Verwendung zu melden, um es zu verbessern.

In Subversion 1.10 wird ein neues Tool für diese Aufgabe eingeführt: svn-mergeinfo-normalizer

Yves Martin
quelle
2
Dieses Tool eignet sich hervorragend zum Konsolidieren von Eigenschaften für Zusammenführungsinformationen, z. B. für Arten, die mit Teilzusammenführungen von Unterverzeichnissen erstellt werden, die möglicherweise von weniger als perfekt koordinierten Entwicklern in einem großen Team erstellt werden. Das Tool scheint ein Problem mit Dateien zu haben, die nicht in jedem Zweig vorhanden sind. Ich erhalte übrig gebliebene Merge-Info-Eigenschaften für Dateien, die Revisionen für Zweige anzeigen, in denen die Datei nie vorhanden war.
Davenpcj
Ich bin damit einverstanden, dass es nicht perfekt ist ... deshalb sind immer noch "menschliche Kontrollen und Kontrollen" erforderlich. Wenn Sie in Ihrem Fall nicht relevante Revisionen in den Eigenschaften für Zusammenführungsinformationen identifiziert haben, können Sie diese Revisionen oder die gesamte Eigenschaft svn: merge-info für diese Dateien entfernen, bevor Sie sie festschreiben. Bitte benutzen Sie Github, um nach Verbesserungen zu fragen.
Yves Martin
4

Ich weiß, dass es eine Weile her ist, aber ich bin auf ein ähnliches Problem gestoßen. Ich benutze TortoiseSVN 1.6.7. Es ist einfach so passiert, dass sich die Eigenschaft im Stammverzeichnis meiner Arbeitskopie befand. Als ich die Eigenschaften im Stammverzeichnis angezeigt und auf Auf svn: mergeinfo entfernen geklickt habe, wurde ich gefragt, ob ich sie rekursiv entfernen möchte. Dies hat alle meine svn: mergeinfo Cockups losgeworden.

moribvndvs
quelle
Ich war in der gleichen Situation. Hat für mich gearbeitet. Vielen Dank!
Andrew
2

Wenn Sie sicher sind, dass Sie mergeinfo-Eigenschaften massenweise entfernen möchten, können Sie das folgende BASH-Skript verwenden.

FILES=`svn status |grep "^ M      " |sed s/" M      "// |tr '\n', ' '`
svn revert $FILES

Es erhält eine Liste der geänderten Dateien, filtert sie so, dass nur Änderungen zusammengeführt werden, entfernt alles außer dem tatsächlichen Dateipfad, konvertiert die Pfade mit einer Zeile in eine durch Leerzeichen getrennte Liste und die Aufrufe werden in dieser Liste zurückgesetzt.

Chase Seibert
quelle
2
Danke, aber wie Sie vielleicht von mir gewusst haben, dass ich TortoiseSVN erwähne, bin ich ein Windows-Benutzer und benutze die Bash-Shell nicht :-)
LeonZandman
Dasselbe sollte unter DOS möglich sein, wenn auch wahrscheinlich nicht so knapp.
Chase Seibert
1
Setzt dies nicht nur Dateien mit geänderter Mergeinfo im aktuellen Arbeitsverzeichnis zurück? Wenn ja, wird das Problem nicht behoben: die vorhandene explizite Mergeinfo. Dafür müssten Sie treiben.
Dominic Scheirlinck
2
Das ist ziemlich fehlerhaft - haben Sie einen Dateinamen mit Leerzeichen im Namen? Mit Glob-Zeichen im Namen? In beiden Fällen schlechte Nachrichten. Die genehmigte / unterstützte Methode zum Analysieren der Ausgabe aus dem SVN-Status ist die Verwendung des --xmlFlags und eines XML-Parsers. Alles andere kann sich zwischen den Versionen ändern, da die Vorwärtskompatibilität für das Textausgabeformat nicht garantiert ist.
Charles Duffy
2

Anstatt die mergeinfo-Eigenschaften nur blind zu löschen, ist es auch möglich, die "fehlenden" Zusammenführungen abzuschließen.

Kopieren Sie die Eigenschaft mergeinfo aus dem Stammordner und führen Sie dann eine Zusammenführung des untergeordneten Ordners für den entsprechenden relativen Pfad und genau dieselbe Revisionsliste durch. (Sie können, müssen aber nicht nur die Unterschiede zwischen dieser Liste und der Liste auflisten, die sich bereits im untergeordneten Ordner befindet.)

Normalerweise sollte diese Zusammenführung nur die mergeinfo-Eigenschaften ändern, keine tatsächlichen Dateien. (Wenn sich dadurch Dateien ändern, muss eine der vorherigen Zusammenführungen nur eine teilweise Zusammenführung gewesen sein, was möglicherweise ohnehin zu Problemen geführt hat.)

Wenn Sie dies tun, wird die mergeinfo-Eigenschaft für Sie gelöscht, sobald beide genau übereinstimmen. Möglicherweise müssen Sie auch das Gegenteil tun: Führen Sie alle Zusammenführungsrevisionen, die nur im untergeordneten Ordner vorhanden sind, in das Stammverzeichnis ein (Sie können auch hier einfach die vollständige Liste einfügen und SVN die Unterschiede für Sie ermitteln lassen).

Miral
quelle
1

Um Änderungen an einer Verzeichnisstruktur vorzunehmen, wäre dies (nur Nicht-DOS-Suche):

find . -path "*/.svn" -prune -or -exec svn propdel svn:mergeinfo '{}' \;

Beim Ausführen eines 1.6.12-Clients, der mit einem 1.5-Server verbunden ist, tritt ein ähnliches Problem auf. Es gibt ein Unterverzeichnis im Projekt, das ein eigenes svn: mergeinfo benötigt, aber 121 solcher Einträge (einschließlich 5 Verzeichnisse unten ./var mit "svn: ignore *") scheinen etwas unangemessen. Daher wäre es schön, ein (zB Python-) Skript zu haben, das in der Lage ist, die offensichtlich überflüssigen Zusammenführungsinformationen zu entfernen und über andere Unterschiede zu berichten ...

Tobias
quelle