SVN Tree Conflict, obwohl kein Konflikt vorliegt

roker002

Commander
Registriert
Dez. 2007
Beiträge
2.075
Ich habe eine Frage... bei der folgende Situation.

Ich habe einen Branch und einen Trunk. Auf dem Trunk wurden neue Datei aufgespielt. So, jetzt gehe ich hin und übernehme mittels Merge die neuen Datei aus dem Trunk. Ich mache einige Änderungen an den schon vorhandenen Dateien (nicht an den Dateien die neu vom Trunk kamen) und Spiele das auf dem Trunk auf. Zuerst muss ich natürlich vom Branch nach Trunk wechseln, dann führe ich den Merge Befehl aus. Dabei Merge ich den Trunk mit Branch (nicht umgekehrt, da ich gerade auf dem Trunk bin).

Der SVN meldet, dass bei den Dateien die neu aufgespielt wurden ein Conflict Tree entstand. Wenn ich die Branch mit den Trunkdateien vergleiche, dann gibt es aber keine Änderungen an den Daten aus dem Branch.

Wieso bekomme ich den blöden Konflikt? SVN Bug?

Zumal ist es noch heftiger, wenn ich die neuen Dateien ausbessern muss, und diese wieder in den Trunk einchecke. So ist die Änderung auf dem Trunk nicht vorhanden, aber ein Konflikt besteht immer noch!

Habe folgende Konfigurationen
PHP version: 5.3.1
USVN version: 1.0.1
Translation: en_US
Database: PDO_MYSQL
Subversion version: 1.6.6
OS: WINNT
 
Kein Bug. Du machst etwas böses. ;)

Das ist ein zyklischer Merge, das macht man mit SVN nicht. Entweder Merges in eine Richtung (vom trunk in einen releasebranch) oder aber Merges in einen Featurebranch und anschließend den Featurebranch mit svn merge --reintegrate zurück in den Trunk überführen und danach löschen. Siehe auch hier:
http://svnbook.red-bean.com/en/1.6/svn-book.html#svn.branchmerge.commonpatterns

Was passiert ist folgendes:
trunk: neue Datei hinzugefügt
branch: trunk mergen -> neue Datei aus trunk im branch hinzugefügt

Wenn du jetzt wieder einen Merge vom branch auf den trunk machst, so sieht der trunk folgendes:
Hey, in branch wurde eine Datei hinzugefügt, die übernehme ich jetzt mal (SVN merge weiß nicht, dass die Datei ursprünglich aus trunk kam) - stellt dabei dann aber fest: Verdammt, ich habe bereits eine Datei dieses Namens. Resultat: tree conflict

Es gibt einen fiesen Workaround. Wenn man diesen falsch benutzt, macht man sich die Mergeinfos aber völlig kaputt. Mach das ausschließlich auf Commandline!

/branch: svn merge /trunk
+ A irgendwas
/branch: svn ci -m "merge from /trunk"
Committed in revision 12345.

Danach sofort ab in den Trunk:
/trunk: svn merge --record-only -c 12345 /branch
/trunk: svn ci -m "record-only merge for revision 12345 from /branch"

Wichtig ist hier das record-only sowie die exakte Revisionsnummer unter der der Merge in den Branch stattgefunden hat! Damit sagst du dem Trunk: Hey, tu mal so, als wenn du Revision 12345 aus /branch schon hättest (also diejenige, die den Treeconflict auslöst). Das aktualisiert nur die Mergeinfos, tut aber sonst nichts. Dass die working copies vorher sauber sind (svn status -u gibt keinen Output) ist hoffentlich selbstverständlich.

Von dieser Lösung kann ich aber nur abraten - lieber die Branching-Strategie überarbeiten und zyklische Merges unbedingt vermeiden.
 
Hey, danke... bin kein SVN Haxor :P
Bei Eclipse SVN habe ich reintergrate info gelesen, aber wie ich es jetzt auf dem TuroiseSVN sehe, steht ein anderer Text.

Also, wenn ich die Daten wieder auf den Trunk aufspielen will, muss ich reintergrate machen oder? Kann ja bei der nächste gelegenheit ausprobieren.
Leider ist die Seite svnbook nicht verfügbar!

Aber was meinst du danach löschen?

MfG

roker002
 
Nach dem reintegrate ist der Branch unbrauchbar. Darauf musst du dann ein svn delete machen.

Einfach mal das Handbuch lesen.

Eclipse SVN auf keinen Fall zum Mergen benutzen. Viel zu viel Bugs und man kommt nicht an alle Optionen. Das einzig zuverlässige ist das Kommandozeilen-Tool. Besser du lernst früher als später damit umzugehen. :)

Lies auf jeden Fall auch das Handbuch, das ich verlinkt habe - am besten von vorne bis hinten. Ernsthaft.
 
An deiner Stelle würde ich schnellst möglich auf ein anderes VCS umstellen. Git oder Mecurial sind wesentlich besser als SVN. Für beide gibts Migrationstools für SVN.
 
@chris, danke
aber das ist nicht meine Entscheidung. Der "Chef" ist bisschen konservativ und kann nur unter sehr schweren umständen umgestimmt werden. Ich hätte lieber auch GIT. Von dem was ich von GIT gelesen habe, bin ich komplett überzeugt, dass es auch besser alles klappen wird.


Bin nur ein Programmierer und nicht Verwalter.

@reinintegrieren!

Wieso ist die Branch unbrauchbar? Kann man vom Trunk nicht runtermergen?
 
Besorg dir doch git-svn. Dann kannst du lokal git benutzen und checkst dann zentral in SVN ein. Cheffe bekommt davon nichts mit :D
 
roker002 schrieb:
Wieso ist die Branch unbrauchbar? Kann man vom Trunk nicht runtermergen?

7H3 N4C3R schrieb:
Lies auf jeden Fall auch das Handbuch, das ich verlinkt habe - am besten von vorne bis hinten. Ernsthaft.

Das war schon genau so ernst gemeint, wie ich es geschrieben habe. Zuviel Text um alles zu erläutern und ggf. Ungenauigkeiten.
 
Zurück
Oben