[linux-l] Re: VCS

Rocco Rutte pdmef at cs.tu-berlin.de
Mi Apr 19 16:27:03 CEST 2006


* Volker Grabsch <vog at notjusthosting.com>:
>On Tue, Apr 18, 2006 at 04:23:31AM +0000, Rocco Rutte wrote:
>> * Volker Grabsch [06-04-14 13:36:53 +0200] wrote:
>> 
>> >Seit Ewigkeiten gibt's wiegesagt schon den Feature-Request für
>> >Subversion, dass es Merges verwalten soll. Vielleicht haben sie das
>> >ja in der neuren Version implementiert, weiß ich nicht. Ist aber auf
>> >jeden Fall keine neue Kritik.  :-)
>> 
>> Die Implementierung wird relativ kompliziert/umfangreich, weil man dafür 
>> merges (und damit Branches) neu für subversion konzipzionieren muss.
>> 
>> Subversion kennt ja nur Kopieren von Dateien, dass man als Branch oder 
>> Tag interpretiert, aber es ist eben nur ein Fake oder generisch oder wie 
>> auch immer man es nennen mag.

>Das ist richtig, aber nicht das Problem. Bei CVS hätte ich dieselben
>Sorgen.

Ich kenne CVS so genau nicht, aber bei subversion ist IMHO genau das 
das Problem.

Vielleicht verstehen wir uns ja falsch; deshalb schreibe ich nochmal 
genauer, was ich meine.

Es gibt ein Repository und darin trunk/, branches/a und 
branches/b. Das sind alles nur Dateien/Verzeichnisse und subversion kann 
nicht wissen, dass alle 3 das selbe Projekt in verschiedenen Zweigen 
repräsentieren. Es müsste beim Anlegen von branches/a und branches/b aus 
trunk/ sich die Revisionsnummern merken und mitverfolgen, wann welcher 
Diff von welcher Branch in welche Branch geht.

Das im Prinzip nicht kompliziert (mit svnlook kann man das parsen und 
selber mitschreiben). Da aber subversion eben nur Dateien kennt, müsste 
man ihm irgendwie mitteilen, dass die 3 Verzeichnisse das selbe Projekt 
repräsentieren. Und IMHO liegt das Kernproblem genau darin, subversion 
diese Logik für die Erkennung von Dateien/Verzeichnissen als "Branch" 
mitzuteilen.

Man könnte ja auch eine Branch aufmachen, die leer ist, um das Projekt 
vom scratch neu zu schreiben. Subversion müsste den Zusammenhang also 
auch ohne eine Kopie von trunk/ merken können und darf nicht nur auf 
Kopien losgehen.

Andererseits ist nicht jedes Kopieren eines Verzeichnisses eine neue 
Branch, die es beobachten soll.

Bei git ist das einfacher. Jeder Commit bekommt eine ID und der aktuelle 
Stand einer Branch ist dann die letzet committete ID. Außerdem bekommt 
jeder Commit seine vorherigen IDs (Mehrzahl) mit, aus der er hervor 
gegangn ist (bei subversion: $revision-1). Will man dann Branch1 nach 
Branch2 mergen, geht man die Liste aller Parent-IDs durch und sucht eine 
Übereinstimmung (das war das Anlegen der Branch). Von da an kann man 
dann bis zur letzten ID die jeweiligen Diffs eines Commits übertragen 
und fertig.

Bei subversion müsste man das alles irgendwie mit einem Skript ermitteln 
und sich Listen von Revisionsnummern erstellen, mit denen man die Diffs 
erhält. Weiss man die Logik (also das Mapping von Verzeichnis auf eine 
Branch), kann man das Skript entsprechend bauen. In den meisten Fällen 
wird das Standardlayout trunk-tags-branches auch gut genug sein. Aber es 
geht eben nicht allgemein und generisch, weil das Konzept Branch nicht 
eingebaut ist.

>> Subversion müsste anfangen zu raten (bzw. konfigurierbar sein), wann 
>> eine Kopie einer Datei/eines Verzeichnisses eine neue Branch ist und die 
>> selbe Logik bei Commits anwenden.

>Das muss es sowieso, wenn die Kommunikation "stateless" ist, was ich
>ja will.

>Beim Holen der Datei die Revision-Nummer (bzw. allgemein Zusatz-
>Infos zur Version) mitzuliefern, und diese beim Hochladen wieder
>mit anzugeben, sollte nicht das Problem sein.

Hmm. Eine Kopie in Subversion ist eine "cheap copy", also copy-on-write. 
Wenn man trunk/foo.c hat und trunk/ nach branches/a kopiert und dann 
branches/a/foo.c ändert, dann ist das für subversion eine normale Datei, 
gegen die ein diff committed wird. Das hat mit dem "Original" 
trunk/foo.c nichts zu tun (außer die History, wofür die Metadaten des 
Copy ja nur gebraucht werden).

>Mir schwebt sogar vor, dass nicht die Datei, sondern nur ein Patch
>wieder zurückgeladen wird, aber das macht die Sache auf Client-Seite
>unnötig schwierig.

Subversion überträgt nur diffs.

>Will man unbedingt zustandsbehaftete Kommunikation, dann ist es erst
>recht ein leichtes, die Versionsnummer sich auf Serverseite zu merken.

Mit der Revisionsnummer ist es aber nicht getan.

   bye, Rocco
-- 
:wq!



Mehr Informationen über die Mailingliste linux-l