SVN Reverse Merge?

70

Mein SVN-Repository war bei Revision 497 perfekt. Ich habe mehrere fehlerhafte Commits ausgeführt, sodass es jetzt bei Revision HEAD ist. Ich sehe, dass Sie zum Rollback einen Befehl wie diesen verwenden sollten:

svn merge -r HEAD:497 .

während im Arbeitsverzeichnis (und das Arbeitsverzeichnis befindet sich in der HEAD-Revision). Aber ist das der richtige Befehl? Oder benutze ich HEAD: 498? oder 496? Ich habe diesen Befehl bereits ausgeführt und die aktuelle Version scheint nicht mit 497 identisch zu sein, da beim Aktualisieren von -r 497 (oder wenn ich eine 497-Arbeitskopie habe und -r HEAD aktualisiere) viele Dateiaktualisierungen auftreten .

Habe ich ein Zaunpfostenproblem, bei dem HEAD: 497 tatsächlich auf 496 zurückgesetzt wird, oder so? Oder ist es so, dass SVN beim Aktualisieren jede Revision erneut durchläuft, obwohl HEAD und 497 identisch sind?

Bearbeiten:

Um zu verdeutlichen, wie ich bereits sagte, wenn ich zwischen 497 und meinem zusammengeführten HEAD aktualisiere, werden viele Dateiänderungen vorgenommen. Ich dachte, wenn 497 und HEAD identisch wären, würde dies erkannt und es würden keine Dateiänderungen auftreten. es würde einfach sagen "Aktualisiert auf Revision 497." Ist mein Befehl also falsch oder ist dieses Denken falsch? (und wenn ja, warum?)

Ricket
quelle
Es führt tatsächlich Zusammenführungen in umgekehrter Reihenfolge durch, und es kann sein, dass einige / die meisten / alle Dateien im Ausgangszustand enden.
Sander Rijken

Antworten:

75

Wenn sich Ihr Repo bei Revision 497 in einem makellosen Zustand befand, müssen Sie Folgendes tun:

svn merge -r HEAD:497 .

Dieser Zusammenführungsbefehl ändert nur Dateien in Ihrer Arbeitskopie. Denken Sie also daran, die Änderungen auch zu übernehmen, um HEAD im Repo zu aktualisieren.

Versuchen Sie nach dem Zusammenführen, gefolgt vom Festschreiben, die Revision 497 mit HEAD zu vergleichen, und sie sollten identisch sein.

Upgradingdave
quelle
Was ist der einfachste Weg, um 497 und HEAD zu vergleichen? Dies ist ein riesiges Repository, und der Zusammenführungsbefehl dauert allein 20 bis 30 Minuten. Gibt es einen Befehl, der serverseitig ausgeführt werden kann und mir nur sagt, ob sie identisch sind, oder muss ich die beiden Revisionen in zwei separate Ordner verschieben und selbst einen Unterschied machen?
Ricket
Normalerweise verwende ich die Eclipse-Subclipse, um einen Vergleich durchzuführen, und ziemlich sicher, dass svn diffhinter den Kulissen eine Variation des Befehls ausgeführt wird, und wie Sie sagten, kann es selbst bei einem kleinen bis mittelgroßen Repo lange dauern, einen Vergleich durchzuführen . Normalerweise schaue ich durch das Protokoll, um ein Gefühl dafür zu bekommen, ob ein Zurücksetzen und / oder ein Zusammenführen so funktioniert hat, wie ich es erwartet hatte. Hier ist ein Link zu weiteren Informationen über den SVN-Diff: svnbook.red-bean.com/de/1.4/…
Upgradingdave
Okay, ich bin erfolgreich zurückgekehrt. Da das erste Mal nicht funktioniert hat, habe ich diesmal HEAD: 496 und dann 496: 497 gemacht und mich dann verpflichtet. Interessant, nach dem Commit dachte es immer noch, ich sei bei r507, also musste ich svn update, um r508 zu werden (was es gerade festgeschrieben hat); Das Update hat natürlich nichts gebracht. Ich habe dann svn diff verwendet und zwei URLs angegeben, und es hat anscheinend ein serverseitiges Diff verwendet, weil es ziemlich schnell war, einen leeren Bildschirm zurückzugeben. Ein Testdiff mit einer anderen Revision bestätigte, dass der Rohling gut ist. endlich identische Revisionen. :)
Ricket
Haben Sie eine bestimmte Datei festgeschrieben? Commit aktualisiert nur die Revision der geänderten Dateien. Mit Update erhalten Sie alle Dateien mit einer einzigen Revision zurück.
Sander Rijken
22

Wenn Sie r123 rückgängig machen möchten, müssen Sie svn merge -r 123:122 .

Dies bedeutet, dass Sie ausführen müssen

svn merge -r HEAD:497 .

So überprüfen Sie den Lauf:

svn diff -r 497
Sander Rijken
quelle
1

Um von einer unerwünschten Änderung zurückzutreten (vielleicht haben Sie andere Dateien mit Debugging-Anweisungen festgeschrieben, zusammen mit etwas, das Sie wirklich festschreiben wollten), sagen Sie, dass die fehlerhafte Änderung -r10 war:

svn update
svn merge -r10:9 <URL of your repository base> .

Jetzt können Sie nur die Datei zurückbringen, die Sie festschreiben wollten:

svn update
svn update -r10
svn commit <just that one file>   # this is the command you meant to type from the beginning
Äther
quelle
0

Wenn Sie eine schnelle und zuverlässige Möglichkeit zum Rollback auf eine bestimmte Revision wünschen, lesen Sie einfach die ältere Revision des Repositorys.

Führen Sie es aus svn info, um sich daran zu erinnern, wie Ihre Repository-URL lautet. Erstellen Sie dann einen neuen Ordner und checken Sie die gewünschte Revision aus:

cd <your new folder>
svn checkout <URL> -r 497 .

Anschließend können Sie diesen Ordner von Ihrem vorhandenen Ordner unterscheiden und die gesamte Revision von dort aus bei Bedarf wieder in das Repository übertragen.

Dan J.
quelle
0

Betrachten Sie HEAD: 150 r1 = 100 und r2 = 90 zurücksetzen

  1. svn auf
  2. svn merge -r 100: 99
  3. svn merge -r 90:89

Hinweis: Durch diese Änderungen wird der Ordner EXTERNALS nicht zurückgesetzt !

piyush89
quelle
0

Reverse Merge In SVN

  • wenn es Dateiebene ist
  • SVN behält den allgemeinen Dateiinhalt in der Arbeitskopie aus der spezifischen Revision der Datei und der HEAD-Revision der Arbeitskopie bei.

  • wenn es Ordnerebene ist

  • Wenn beim SVN-Reverse-Merge keine Datei in der jeweiligen Revision gefunden wird, bleibt die Arbeitskopie unverändert.
Shyamasundara N.
quelle