Obwohl ich mich irgendwie mit VCS auskenne (regulärer svn-, git- und git-svn-Benutzer), kann ich mich nicht um dieses eigentümliche SVN-Verhalten kümmern.
Wann immer ich ein Verzeichnis in meiner SVN-Arbeitskopie aus einem ansonsten 'sauberen' Zustand umbenennen muss - dh svn status
nichts zurückgeben und alle anderen Änderungen festgeschrieben wurden - wie dies (was das SVN-Dokument vorschlägt):
svn mv foo bar
svn commit
SVN beschwert sich laut:
Adding bar
Adding bar/toto
Deleting foo
svn: Commit failed (details follow):
svn: Item '/test/foo' is out of date
Wie du möchtest:
svn update
Welches gibt:
C foo
At revision 46.
Summary of conflicts:
Tree conflicts: 1
Es gibt einen Baumkonflikt, während keine Änderung durch Dritte stattgefunden hat . Offensichtlich ist der einzige Weg, um aus diesem Baumkonflikt-Chaos herauszukommen, generisch (aus dem roten Buch von svn):
svn resolve --accept working -R .
svn commit
Das Umbenennen im Repo per Fernzugriff und das Aktualisieren meiner Arbeitskopie scheint ziemlich umständlich:
url=$(svn info | grep -e '^URL:' | sed 's/^URL: //') svn mv $url/foo $url/bar
svn update
Gibt es eine sanktionierte, optimierte Möglichkeit, einen fehlenden Ordner umzubenennen? Was ist die Hauptursache für diesen besonders überraschenden Baumkonfliktzustand?
svn mv
. Dateien im Inneren erhielten Arbeit und wurden vor festgeschriebensvn mv
.Antworten:
svn mv
funktioniert bei mir:Entschuldigung für die schwedische Ausgabe von svn.
Es muss noch etwas anderes in Ihrem Fall falsch sein.
Bearbeiten:
Wie in den Kommentaren von Lloeki ausgeführt
Um das Verhalten zu reproduzieren, müssen Sie auch eine im Ordner enthaltene Datei aktualisieren und festschreiben, jedoch nicht den Ordner selbst aktualisieren.
Das Verhalten ist "erwartet" und die "Lösung" besteht darin, die Arbeitskopie vor der Ausgabe des
svn rename
Befehls zu aktualisieren .quelle
svn log
nach jedem Commit), daher befinden sich Dir-Metadaten bei Rev n-1 . Daraus folgt, dass svn aufgrund des Metadatenunterschieds keine Festschreibung vornimmt und nicht aktualisiert wird, da tatsächlich ein Konflikt im Verzeichnis vorliegt: Metadaten aktualisieren vs. löschen.OK, ich bin darauf gestoßen - und kann das Problem schließlich mit einer einfachen Terminalsitzung rekonstruieren: Das Problem tritt auf, wenn Sie
svn mv
eine Datei (verschieben / umbenennen); dann begehen Sie diese Änderung; dann ( ohne einen tunsvn update
zuerst),svn mv
das übergeordnete Verzeichnis der Datei , deren Verschieben / Umbenennen wurde zuvor begangen - und schließlich ein tunsvn commit
auf der Änderung des Verzeichnisnamens - oder als akzeptierte Antwort formuliert es so : " Sie aktualisieren müssen und sich verpflichten , eine Datei im Ordner enthalten, aber nicht den Ordner selbst aktualisieren "; All dies wird jedoch in einem übergeordneten Verzeichnis (oder besser gesagt einem Vorfahrenverzeichnis) ausgeführt. Das folgende Befehlszeilenprotokoll zeigt das Problem:Und so hätte es sein sollen - eine
svn up
Aktion ausführen, nachdem die Datei verschoben / umbenannt wurde; Beachten Sie, wie sich die Versionsnummernsvn status -v
nach demsvn update
Befehl ändern :Und wie OP sagte - sollte man vergessen, dies zu tun,
svn update
bevor ein neuer Zug / Umbenennen + Festschreiben erfolgt und das "Festschreiben fehlgeschlagen" aufgetreten ist - dann kann man verwendensvn resolve --accept working -R .
, um die Festschreibungsaktion beenden zu können.quelle
Das hat bei mir funktioniert:
Ich vermute, dass es verschiedene andere Möglichkeiten gab, und dass es auch den Trick getan hätte, sicherzustellen, dass vor dem svn mv ein sauberes Arbeitsverzeichnis vorhanden war.
quelle
Man könnte sich ein Szenario vorstellen, in dem das Verzeichnis von einem anderen Benutzer im Repository geändert wurde. Das Umbenennen desselben Ordners in Ihrer Arbeitskopie kann beim Festschreiben Baumkonflikte auslösen.
Das Lösen von Konflikten zeigt, wie Sie "Baumkonflikte" in Subversion lösen.
quelle