David Claßen

VisualStudioOnline (VSO) bietet die grundsätzliche Möglichkeit, sehr schnell, einfach und für kleine Projekte auch kostenlos vollständige Projektumgebungen zu schaffen. Neben der reinen Codeverwaltung durch den Team Foundation Server (TFS) erhält man dort weitere Unterstützung durch die Abbildung von z.B. agilen Projektmethoden oder Team Räumen in denen sich Entwickler austauschen können.

Kleiner Exkurs: TFVC vs. Git

Der TFS unterstützt die Entwicklung durch die beiden Repositories TFVC (Team Foundation Version Control) und Git. TFVC ist das vom TFS eigens mitgebrachte Repository wohingegen Git ein OpenSource Repository ist, dass sich bereits großer Beliebtheit erfreut. Es gibt einige Unterschiede, Vor- und Nachteile die für oder gegen die Verwendung von TFVC oder Git sprechen. Der größte Unterschied ist sicherlich der, das TFVC zentralisiert und Git dezentralisiert arbeitet.
Bei TFVC liegen der gesamte Quellcode und damit auch alle Versionen, Eincheckkommentare etc. zentral in dem Repository auf dem TFS. Jeder Entwickler holt sich die aktuellste Version des Repository auf seinen Rechner und entwickelt dort lokal. Zum einchecken neuer Entwicklungen, um sich die Historie eines Datei ansehen zu können oder Versionsstände miteinander vergleichen zu können benötigt er eine Verbindung zum TFS, da diese Informationen nicht lokal vorliegen.
Das Branching muss ebenfalls zentral auf dem Server erfolgen bzw. bei bestehender Verbindung zum Server. Dadurch kann es vorkommen, dass man innerhalb kurzer Zeit eine Vielzahl von Branches hat und die Übersicht verloren geht.

Bei der Verwendung von Git holt sich der Entwickler das gesamte Repository mit all seinen Informationen auf seinen lokalen Rechner. Es wird eine vollständige Kopie des Repository vom Server erstellt. Damit ist der Entwickler in der Lage, auch offline Einblick in die Historien zu nehmen, Entwicklungen zu mergen oder Versionen zu vergleichen. Zu einem beliebigen Zeitpunkt erfolgt dann der push in das zentrale Git Repository auf dem Server. Durch dieses Strategie wirkt auch der Umgang mit Branches etwas leichtgewichtiger und sorgt in manchen Fällen für mehr Ordnung im zentralen Repository, weil nicht jeder Branch eingechekt (gepusht) werden muss. Der Entwickler kann lokal neue Branches von seinem Repository erstellen und diese nach Abschluss auch wieder verwerfen. Das funktioniert eben nur, weil er das vollständige Repository lokal zur Verfügung hat.
Ein möglicher Vorteil von Git ist, dass es durch den Status OpenSource eine große Community und zahlreiche Tools gibt, die den Umgang mit Git zusätzlich erleichtern bzw. den Funktionsumfang erweitern.

Zusammengefasst: Besser oder schlechter gibt es nicht. Es lohnt sich kurz darüber nachzudenken, was für die Entwicklung wichtig ist und wie man grundsätzlich Vorgehen möchte. Eine Zusammenfassung der jeweiligen Funktionsumfänge kann hier eingesehen werden.

Die Migration von TFVC zu Git

Es gab die Situation, dass wir von einem in VisualStudioOnline existierendem Projekt basierend auf TFVC in ein anderes Git-Respository innerhalb von VisualStudioOnline migrieren wollten. Leider gibt es dafür keinerlei Unterstützung innerhalb von VisualStudioOnline. Der vermutlich einfachste und naheliegenste Weg wäre, den Quellcode einmal auszuchecken und in das neue Repository einzuchecken. Dabei würde jedoch sämtliche Historie etc. am Quellcode verloren gehen, weil wir beim auschecken lediglich die aktuellste Version des Repository bekommen (TFVC = zentral).

Nach längerer Recherche und einigen Tassen Kaffee konnte jedoch ein Weg gefunden werden, der hier vorgestellt werden soll. Dieses Vorgehen hat in diesem Fall gut funktioniert. Ich möchte jedoch nicht ausschließen, dass es einen besseren oder einfacheren Weg gibt.

Voraussetzung

  • Die Voraussetzung, um eine Migration überhaupt vornehmen zu können ist, dass der zu migrierende Quellcode in einem Branch vorliegt. Typischerweise gibt es zumindest einen Main-Branch, der den Hauptentwicklungszweig abbildet. Da man jedoch nicht gezwungen ist einen Branch anzulegen (man kann den Code auch ohne Branch im Repository ablegen und verwalten), könnte sich hier das erste ToDo ergeben. Der Branch kann über den Quellcode-Explorer im VisualStudio erstellt werden. Rechtsklick auf das Verzeichnis – „Verzweigen und zusammenführen“ – „In Verzweigung konvertieren“.  Danach sollte sich das Symbol des Verzeichnisses ändern.
    MainBranch
  • Damit es im späteren Verlauf möglich ist, sich von externen Tools aus gegen Visual Studio Online zu authentifizieren, ist eine Einstellung im Benutzerprofil vorzunehmen. Dieses kann man Online vornehmen durch eine Klick auf seinen Namen oben rechts und wählt dann „My profile“. Dort hinterlegt man einen alternativen Benutzernamen und vergibt ein separates Kennwort. Diese Informationen werden später benötigt.

AlternateCredentials

  • Auf Codeplex findet man ein kleines Git-basierendes Kommandozeilentool, dass wir für die Migration benötigen. Dieses nennt sich GIT-TF und muss heruntergeladen werden. Ich habe den Inhalt entpackt und unter C:\git-tf\ abgelegt.
  • Zusätzlich habe ich GIT heruntergeladen und installiert.

Schritt 1: TFVC zu Git klonen

Im ersten Schritt nutzen wir git-tf um das alte Projekt vollständig herunter zu laden und in einem lokalen Git-Repository zu speichern.

git tf clone https://[URL].visualstudio.com/DefaultCollection $/[Projekt]/[Branch]

Dabei wir der Benutzername und das Passwort abgefragt, mit dem sich der Dienst bei Visual Studio Online authentifizieren soll. Wichtig ist an dieser Stelle, die zuvor eingerichteten alternativen Credentials zu verwenden.
Mit diesem Aufruf wird der Main-Branch aus dem TFVC Projekt in einen Zielordner auf lokalen Festplatte geklont. Dieser Vorgang kann abhängig von der Größe des Projektes, der Anzahl von Dateien etc. und vor allem der Historie durchaus länger (Minuten bis Stunden) dauern. Im Ergebnis steht ein lokales Git-Repository mit der vollständigen Historie aus dem TFVC zur Verfügung.

Der gewünschte (lokale) Zielordner kann im Aufruf mit angegeben werden. Wird keiner angegeben, wird ein neues Verzeichnis an der aktuellen Stelle automatisch angelegt.

git tf clone https://[URL].visualstudio.com/DefaultCollection $/[Projekt]/[Branch] [Zielordner]

Schritt 2: Neues Git-Projekt

Falls noch nicht erfolgt, sollte an dieser Stelle das neue Projekt basierend auf Git erstellt werden. In Visual Studio Online kann dieses bei der Anlage eines neuen Projektes direkt ausgewählt werden.

NewGitProject

Nach erfolgreicher Erstellung direkt zum Projekt navigieren und dort in den Tab „Code“ gehen. Im unteren Bereich der Seite befindet sich der Punkt „Push an existing repository“, unter dem die im nächsten Schritt benötigten Kommandozeilenbefehle direkt abgelesen werden können.

NewProject

Schritt 3: „Push“ ins neue Git-Repository auf dem TFS

Zurück zur Kommandozeile. Dort in das Verzeichnis des grade geklonten Branch wechsel. Dort kann nun der erste Befehl von der Visual Studio Online Seite ausgeführt werden. Dieser setzt den internen Pfad des Ziel-Repository neu. Für den Aufruf wird nun nicht mehr git-tf sondern git verwendet.

git remote add origin https://[URL].visualstudio.com/DefaultCollection/_git/[neues Projekt]

Anschließend kann das Repository in das neue Git-Repository auf den TFS „gepusht“ werden.

git push -u origin –all

GitPush

Auch hierbei werden wieder Benutzername und Passwort abgefragt. Hier gilt gleiches wie beim Klonen: Den alternativen Benutzernamen und dessen Kennwort verwenden.

Wenn nun in Visual Studio Online die Ansicht für das neue Git-Projekt aktualisiert wird erscheint der gesamte Quellcode und das Projekt wurde erfolgreich migriert.