Friedrich-Alexander-Universität UnivisSuche FAU-Logo
Techn. Fakultät Willkommen am Department Informatik FAU-Logo
Logo I4
Lehrstuhl für Informatik 4
Betriebssystemtechnik
 
  Vorlesung
    - UnivIS-Infos
    - Inhalt
    - Voraussetzungen
    - Prüfungen
    - Folien
 
  Übungen
    - Inhalt
    - Tipps
       * Teamarbeit mit svn
       * Tools
       * AOStuBS-System
    - Aufgaben
       * A 1
       * A 2
       * A 3
       * A 4
       * A 5
       * A 6
       * A 7
 
  Evaluation
Department Informatik  >  Informatik 4  >  Lehre  >  SS 2008  >  Betriebssystemtechnik  >  Übungen  >  Teamarbeit mit svn

Teamarbeit mit svn

Bei der gemeinsamen Arbeit an einem mit svn verwalteten Projekt gibt es immer wieder mal Schwierigkeiten, die Arbeit so zu organisieren, dass:

  • Die HEAD-Version des Repositories immmer konsistent ist und sich übersetzen lässt.
  • Die Arbeit der einzelnen Kleingruppen nicht behindert wird.
Das Problem ist, dass sich sowohl die Kleingruppen (KG) als auch das Gesamtteam (GT) über svn synchronisieren müssen. Des weiteren sind manchmal Änderungen, die Einfluss auf die Arbeit anderer KGs haben, unvermeidbar. Im Folgenden werden deshalb kurz ein paar typische Szenarien geschildert und gezeigt, wie man das jeweilige Problem mit Branching & Merging sowie Switching in den Griff kriegen kann.

Hinweis: Die Beispiele können und sollen nicht das svn-Buch ersetzen (s. u.)!

Szenarien

1) Eine KG hat etwas eingecheckt, was nicht geht! (svn switch)

Das soll natürlich vermieden werden, aber wir sind alle Menschen und Fehler passieren nun einmal. Nehmen wir einmal an, die KG mem hat etwas eingecheckt (committed), was sich nicht übersetzen lässt, wo doch vorher noch alles ging. Gut, dann wechseln wir doch den Teilbaum von mem in unserer Arbeitskopie einfach auf die vorherige Version:

  1. Nachschauen, in welcher Revision die Änderungen erfolgt sind:
    lohmann@faui48>pwd
    /home/inf4/lohmann/ose-workspace/aose/os/mem
    lohmann@faui48>svn log .
    ------------------------------------------------------------------------
    r254 | sijnstre | 2005-06-20 21:15:07 +0200 (Mon, 20 Jun 2005) | 1 line
    
    [mem] malloc und free scheinen in der Billigstkonfiguration 
    (mem_memorymanagement, mem_allocationstrategy, mem_firstfit, 
    mem_freememmanagement, sonst nix) erstmal zu funktionieren.
    ------------------------------------------------------------------------
    r253 | sijnstre | 2005-06-20 18:42:19 +0200 (Mon, 20 Jun 2005) | 1 line
    
    [mem] Alle nicht auf Kompilieren getesteten Teile auskommentiert. 
    Damit sollten von unserer Seite aus erstmal keine Fehler beim 
    Kompilieren mehr auftreten ;-)
    ------------------------------------------------------------------------
    ...
    lohmann@faui48>
    
    Aha, in r254 wurden also diverse Änderungen vorgenommen. Wir wollen zurück zu r253! (Wie man sieht, sind sinnvolle Log-Kommentare wichtig!)
  2. svn switch ausführen:
    lohmann@faui48>svn info
    Path: .
    URL: https://www4:8088/i4ose/ose-2005/trunk/aose/os/mem
    Repository UUID: 807f4f15-baf5-0310-b075-da574c7057c0
    Revision: 258
    Node Kind: directory
    Schedule: normal
    Last Changed Author: sijnstre
    Last Changed Rev: 254
    Last Changed Date: 2005-06-20 21:15:07 +0200 (Mon, 20 Jun 2005)
    
    lohmann@faui48>svn switch https://www4:8088/i4ose/ose-2005/trunk/aose/os/mem -r 253
    U  FirstFit.ah
    U  Joining.ah
    U  MemoryManager.cc
    U  MemoryManager.h
    U  FreeChunkManagement.cc
    U  NextFit.ah
    U  LowLevelManagement.cc
    Updated to revision 253.
    
    lohmann@faui48>svn info
    Path: .
    URL: https://www4:8088/i4ose/ose-2005/trunk/aose/os/mem
    Repository UUID: 807f4f15-baf5-0310-b075-da574c7057c0
    Revision: 253
    Node Kind: directory
    Schedule: normal
    Last Changed Author: sijnstre
    Last Changed Rev: 253
    Last Changed Date: 2005-06-20 18:42:19 +0200 (Mon, 20 Jun 2005)
    
    lohmann@faui48>
    
    Ab jetzt liegt der Teilbaum von mem als r253 vor, während alles andere weiter auf r258 steht. Vorsichtig muss man nun allerdings mit svn update sein. Wenn man das in mem ausführt, werden die Dateien wieder durch die HEAD-Revision ersetzt!

2) Eine KG will während der Bearbeitung svn verwenden, aber nicht die HEAD-Revision "verunreinigen" (branch)

Eine KG will sozusagen ein "privates Repository", über das die Teilnehmer gemeinsam arbeiten, ohne dabei die Arbeiten der anderen KGs zu behindern. In diesem Fall bietet es sich an, für den eigenen Teilbaum einen Branch anzulegen und auf diesen zu wechseln:

  1. Branch anlegen mit svn copy:
    lohmann@faui48>pwd
    /home/inf4/lohmann/ose-workspace/aose/os/pv_examples
    lohmann@faui48>svn info | grep URL
    URL: https://www4:8088/i4ose/ose-2005/trunk/aose/os/pv_examples
    
    lohmann@faui48>svn copy . https://www4:8088/i4ose/ose-2005/branches/pv_examples-working -m "BRANCHED pv_examples"
    
    Committed revision 259.
    
    Diese Zeilen speichern eine Kopie der aktuellen Arbeitsversion unter einer anderen URL. Beachtet den Pfad, unter dem die Kopie abgelegt wird: https://www4:8088/i4ose/ose-2005/branches/pv_examples-working.
  2. svn switch ausführen: Das kennt ihr bereits von oben. Alle Mitglieder der KG müssen nun in ihrer Arbeitskopie auf den Branch wechseln:
    lohmann@faui48>svn info | grep URL
    URL: https://www4:8088/i4ose/ose-2005/trunk/aose/os/pv_examples
    
    lohmann@faui48>svn switch https://www4:8088/i4ose/ose-2005/branches/pv_examples-working
    At revision 259.
    
    lohmann@faui48>svn info | grep URL
    URL: https://www4:8088/i4ose/ose-2005/branches/pv_examples-working
    
    Alle svn-Kommandos (update, commit) wirken sich nun in der Arbeitskopie für pv_examples auf den geänderten Branch aus, während der Rest weiterhin aus dem Trunk kommt und auch auf diesen wirkt. Die pv_examples-KG kann also ungestört ihre Arbeiten durchführen, während alle anderen KGs weiterhin die (stabile) Trunk-Version von pv_examples verwenden.

3) Übernehmen der Änderungen aus dem privaten Branch in den Trunk (merge)

Nehmen wir an, eine KG ist wie oben geschildert vorgegangen und hat nun einige Änderungen vorgenommen. Die Änderungen funktionieren gut, nun soll das Ganze wieder in den Trunk übernommen werden:

  1. Ermitteln des Bereichs, der integriert (Englisch: merge) werden soll:
    Zunächst muss der Bereich ermittelt werden, der in den Trunk integriert werden soll. Dabei muss man aufpassen, dass man nicht dieselben Änderungen mehrfach hineinintegriert! Im Log muss daher zunächst die Revision seit dem letzten Merge oder Branch ermittelt werden. Wurde noch kein Merge durchgeführt, so verwendet man die Revision, bei der das Branching durchgeführt wurde:
    lohmann@faui48>svn info | grep URL
    URL: https://www4:8088/i4ose/ose-2005/branches/pv_examples-working
    lohmann@faui48>svn update
    At revision 261.
    lohmann@faui48>svn log
    ------------------------------------------------------------------------
    r261 | lohmann | 2005-06-21 12:57:23 +0200 (Tue, 21 Jun 2005) | 1 line
    
    added a dummy comment
    ------------------------------------------------------------------------
    r260 | lohmann | 2005-06-21 12:56:16 +0200 (Tue, 21 Jun 2005) | 2 lines
    
    added MyClassC (for svn demo)
    
    ------------------------------------------------------------------------
    r259 | lohmann | 2005-06-21 11:31:42 +0200 (Tue, 21 Jun 2005) | 1 line
    
    BRANCHED pv_examples
    ------------------------------------------------------------------------
    
    Im Beispiel hat es noch kein Merge gegeben, die gesuchte Revision ist also r259.
  2. In den Trunk wechseln:
    Nun wechselt man in den Trunk, entweder durch svn switch oder in eine andere Arbeitskopie, in der man den Trunk ausgecheckt hat:
    ... (in den Trunk wechseln)
    lohmann@faui48>svn update
    At revision 261.
    lohmann@faui48>svn info | grep URL
    URL: https://www4:8088/i4ose/ose-2005/trunk/aose/os/pv_examples
    lohmann@faui48>
    
  3. svn merge durchführen:
    lohmann@faui48>svn merge -r 259:HEAD https://www4:8088/i4ose/ose-2005/branches/pv_examples-working
    U  MyClassA.h
    A  MyClassC.cc
    A  MyClassC.h
    lohmann@faui48>
    
    Damit wurden alle Änderungen der Revisionen 259 bis zum HEAD aus dem working-branch in die aktuelle Arbeitskopie, welche den Trunk widerspiegelt, übernommen. (Im Beispiel hatte ich im working-branch zwei Dateien hinzugefügt und eine geändert.)
  4. Transformieren, Kompilieren, Testen!
    Der gemergte Code wird nun ausführlich getestet.
  5. Finales Commit:
    lohmann@faui48>svn commit -m "MERGED pv_examples-working changes into the trunk"
    Sending        pv_examples/MyClassA.h
    Adding         pv_examples/MyClassC.cc
    Adding         pv_examples/MyClassC.h
    Transmitting file data .
    Committed revision 262.
    lohmann@faui48>
    

4) Mehrere KGs wollen bei der Bearbeitung zusammenarbeiten, ohne die HEAD-Revision zu "verunreinigen" (switch)

Nehmen wir mal an, die KG guard hat umfangreiche Änderungen vor, die auch die KGs drivers und com betreffen. Dann kann guard die "fertigen" Versionen natürlich nicht direkt in den trunk übernehmen; die Gerätetreiber etc. müssen ja auch noch angepasst werden. Dafür kann man wie folgt vorgehen:

  1. guard legt einen Branch an:
    Wie oben, guard legt einen Branch an, wechselt seine Arbeitskopien auf diesen Branch und vollzieht die Änderungen.

  2. drivers und com importieren den guard-Branch:
    Sobald guard "in sich" wieder konsistent ist, sollten drivers und com auf die neue Struktur umstellen. Dazu wechseln sie einfach per svn switch in ihrer Arbeitskopie den guard-Teil auf den bearbeiteten Branch um. Falls danach noch umfangreiche Änderungen im eigenen Code anstehen, verwenden drivers bzw. com dafür wiederum den eigenen Branch.

  3. Gemeinsames Übernehmen der Änderungen in den Trunk
  4. Hier ist jetzt Absprache erforderlich: Nachdem alle KGs die Änderungen soweit integriert haben, dass es wieder funktioniert, können diese wie oben beschrieben in den Trunk übernommen werden. Das macht am besten eine KG stellvertretend für alle.

svn-Dokumentation

Subversion-Buch (PDF) : svn-book.pdf
Subversion-Buch (HTML, online) : Version Control with Subversion
  Impressum Stand: 2008-02-11 09:59   DL, WH