361 Stimmen

Warum bekomme ich Baumkonflikte in Subversion?

Ich hatte einen Feature-Zweig meines Stammes und führte regelmäßig Änderungen aus meinem Stamm in meinen Zweig ein und alles funktionierte einwandfrei. Heute wollte ich den Zweig wieder mit dem Stamm zusammenführen, und alle Dateien, die nach der Erstellung meines Zweigs zu meinem Stamm hinzugefügt wurden, wurden als "Baumkonflikt" gekennzeichnet. Gibt es eine Möglichkeit, dies in Zukunft zu vermeiden?

Ich glaube nicht, dass diese richtig gekennzeichnet sind.

403voto

gicappa Punkte 4842

Ich habe die Lösung gefunden, indem ich den Link gelesen habe, den Gary angegeben hat (und ich empfehle, diesen Weg zu gehen).

Zusammenfassen, um den Baumkonflikt zu lösen Übertragen Ihres Arbeitsverzeichnisses mit SVN-Client 1.6.x können Sie verwenden:

svn resolve --accept working -R .

wobei . ist das konfliktbehaftete Verzeichnis.

WARNUNG : "Ihr Arbeitsverzeichnis übertragen" bedeutet, dass Ihre Sandbox-Struktur diejenige ist, die Sie übertragen, d.h. wenn Sie z.B. eine Datei aus Ihrer Sandbox löschen, wird diese auch aus dem Repository gelöscht. Dies gilt nur für das konfliktbehaftete Verzeichnis.

Auf diese Weise schlagen wir SVN vor, um den Konflikt zu lösen ( --resolve ), das Akzeptieren der Arbeitskopie in Ihrer Sandbox ( --accept working ), rekursiv ( -R ), beginnend mit dem aktuellen Verzeichnis ( . ).

In TortoiseSVN behebt die Auswahl von "Gelöst" beim Rechtsklick dieses Problem.

61voto

Gary.Ray Punkte 6201

Subversion 1.6 fügte Baumkonflikte hinzu, um Konflikte auf Verzeichnisebene abzudecken. Ein gutes Beispiel wäre, wenn Sie eine Datei lokal löschen und dann eine Aktualisierung versucht, eine Textänderung auf diese Datei zu übertragen. Ein anderes Beispiel ist das Umbenennen einer Datei, die Sie gerade bearbeiten, da dies eine Hinzufügen/Löschen-Aktion ist.

Der Subversion Blog von CollabNet hat einen großartigen Artikel über Baum-Konflikte .

34voto

shmimpie Punkte 357

Meiner Erfahrung nach erzeugt SVN immer dann einen Baumkonflikt, wenn ich einen Ordner lösche. Es scheint keinen Grund dafür zu geben.

Ich bin der Einzige, der an meinem Code arbeitet -> Löschen eines Verzeichnisses -> Übertragen -> Konflikt!

Ich kann es kaum erwarten, zu Git .

Ich sollte klarstellen - ich verwende Subclipse . Das ist wahrscheinlich das Problem! Nochmals, ich kann es nicht erwarten, zu wechseln...

29voto

Smarb Punkte 281

Ich weiß nicht, ob das auch bei Ihnen der Fall ist, aber manchmal wähle ich das falsche Verzeichnis zum Zusammenführen und erhalte diese Fehlermeldung, obwohl alle Dateien völlig in Ordnung sind.

Zusammenführen von /svn/Projekt/Zweige/einige-Zweige/Quellen nach /svn/Projekt/Stamm ---> Baumkonflikt

Zusammenführen von /svn/Projekt/Verzweigungen/some-branch nach /svn/Projekt/trunk ---> OK

Das mag ein dummer Fehler sein, aber er ist nicht immer offensichtlich, weil man denkt, es sei etwas Komplizierteres.

19voto

Gábor Angyal Punkte 2072

Was hier geschieht, ist Folgendes: Sie erstellen eine neue Datei in Ihrem Stamm und führen sie dann in Ihrem Zweig zusammen. Beim Merge-Commit wird diese Datei auch in Ihrem Zweig erstellt.

Wenn Sie Ihren Zweig wieder in den Stamm einbinden, versucht SVN dasselbe noch einmal zu tun: Es sieht, dass eine Datei in Ihrem Zweig erstellt wurde, und versucht, sie in Ihrem Stamm in der Zusammenführungsübergabe zu erstellen, aber sie existiert bereits! Dies erzeugt einen Baumkonflikt.

Der Weg, dies zu vermeiden, besteht darin, eine spezielle Zusammenführung, eine Wiedereingliederung . Sie können dies mit der Option --reintegrate Schalter.

Sie können dies in der Dokumentation nachlesen: http://svnbook.red-bean.com/en/1.7/svn.branchmerge.basicmerging.html#svn.branchemerge.basicmerging.reintegrate

Wenn Sie Ihren Zweig wieder mit dem Stamm zusammenführen, müssen Sie jedoch Mathematik ganz anders aus. Ihr Funktionszweig ist nun ein Mischmasch aus duplizierten Änderungen am Stamm und Änderungen am privaten Zweig, so dass gibt es keinen einfachen zusammenhängenden Bereich von Revisionen, den man kopieren kann. Durch die Option --reintegrate angeben, bitten Sie Subversion, die sorgfältig nur die Änderungen zu replizieren, die nur für Ihren Zweig gelten. (Und tatsächlich Tatsächlich tut es dies, indem es den letzten Stamm-Baum mit dem letzten Zweigbaum vergleicht: der resultierende Unterschied sind genau Ihre Zweigänderungen!)

Nach der Reintegration eines Zweiges ist es sehr ratsam, ihn zu entfernen, da Sie sonst immer wieder Baumkonflikte bekommen, wenn Sie in die andere Richtung zusammenführen: vom Stamm zu Ihrem Zweig. (Aus genau demselben Grund wie zuvor beschrieben.)

Es gibt auch eine Möglichkeit, dies zu umgehen, aber ich habe sie nie ausprobiert. Sie können es in diesem Beitrag lesen: Wiedereingliederung des Subversion-Zweiges in v1.6

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X