Ich benutze für diese Zwecke Subversion. Es ermöglicht die gleichzeitige Bearbeitung ohne das Sperren von Dateien und kann Änderungen nicht nur an Quelltexten, sondern an beliebigen Dateien und Verzeichnissen nachvollziehen. Zudem gibt es mit AnkhSVN und TortoiseSVN hervorragende freie PlugIns für Visual Studio und den Windows Explorer. Ausserdem gibt es ausführliche Literatur dazu direkt im Web und zum Herunterladen.
Beim Erstellen der Subversionrepositories hat sich bei mir folgende Strategie bewährt:
- Es gibt nur ein Repository
- Es wird nur ein Subversion-Projekt erstellt. Das vorgeschlagene Projektlayout mit den Verzeichnissen trunk, branches und tags wird in diesem Projekt erstellt.
- Jedes Projekt, an dem gearbeitet wird, erhält in diesem Subversionprojekt ein Verzeichnis, in dem die Solution gespeichert wird.
Jetzt sind alle Projekte in einem einzigen Repository und können in einem Rutsch vom Server geladen und committed werden. Ausserdem ist die Wiederverwendung von Code aus anderen Solutions einfacher: Wird jede Solution in einem eigenen Repository gespeichert, muss man immer Annahmen treffen, in welchen Order das Projekt auf dem Entwicklungsrechner ausgecheckt wird. So können die Pfadangaben stattdessen relativ erfolgen und es ist egal, wohin jeder Entwickler seinen Code lokal speichert.
Allerdings ist es wichtig, zur Erstellung von Releases jedes Einzelprojekts einen eigenen Codebaum für die Vorbereitung und spätere Pflege in branches anzulegen, um von Änderungen in anderen Projekten unabhängig zu sein. Das eigentliche Release wird dann als tag abgelegt. Das Procedere ist im SVN-Buch noch einmal genauer beschrieben.
Das hört sich alles kompliziert und aufwändig an, tatsächlich ist es aber die Variante, die am schnellsten zu Ergebnissen führt und trotzdem für stabilen Code sorgt.