Mercurial

Ein muss für jedes gute Forum
Post Reply
Benni
Tutorial Reader
Posts: 65
Joined: 09 Jan 2009, 23:38

Mercurial

Post: # 75031Post Benni
20 Jan 2010, 16:19

Nachdem ich jetzt mehrmals gelesen habe, dass die meisten Leute hier mehrere Kopien des gesamten Ordners machen, um frühere Versionen ihrer Projekte zu archivieren oder dass Spiele nicht weiter entwickelt wurden, weil irgendwann eine Änderung vorgenommen wurde, die bewirkt hat dass nichts mehr funktioniert und man nicht mehr rausbekommt, was die Ursache war, möchte ich an dieser Stelle mal kurz eine etwas elegantere Lösung für diese Problematik vorstellen.

Vielleicht kennt der ein oder andere bereits Versionsverwaltungssysteme wie CVS oder SVN. Diese Systeme sind normalerweise für die Softwareentwicklung gedacht und sollen es ermöglichen, dass mehrere Entwickler gleichzeitig am gleichen Projekt arbeiten. Dazu liegt eine Kopie des Codes auf einem zentralen Server und die Entwickler arbeiten jeweils auf einer lokalen Kopie. Sobald sie eine Änderung fertig haben, senden sie diese an den Server, der sie mit den Änderungen der anderen Entwickler zusammenfügt, womit sichergestellt ist, dass immer alle auf der gleichen Version arbeiten. Man kann sich eine Liste aller Änderungen anzeigen lassen, um zu sehen wer wann was gemacht hat und wie das Projekt sich über die Zeit entwickelt hat und wenn man was kaputtgemacht hat, kann man bequem per Mausklick auf eine beliebige frühere Version zurückspringen.

Natürlich ist das für ein PaC-DK-Projekt etwas überdimensioniert. Fast alle Spiele hier werden von Einzelpersonen entwickelt und den Stress, extra noch einen Server einzurichten will sich wohl kaum jemand machen. Die Übersicht der Änderungen und das bequeme Zurückspringen sind hingegen äußerst sinnvoll, weil dadurch genau die eingangs erwähnten Probleme ohne großen Aufwand gelöst werden. Glücklicherweise gibt es für diesen Fall auch ein passendes Programm: Mercurial. Im Gegensatz zu den serverbasierten Systemen läuft Mercurial lokal und erfordert keine komplexe Einrichtung. Gleichzeitig bietet es alle Vorteile seiner serverbasierten Cousins und ist perfekt für den ambitionierten Adventure-Entwickler geeignet. Und das beste: Es ist Open Source Software und somit völlig kostenlos. ;-)

Da Mercurial selbst erstmal nur das Versionierungssystem an sich ist und keinerlei grafische Oberfläche mitbringt, lässt es sich unter Windows am besten mit der Explorer-Erweiterung TortoiseHg nutzen. Diese kann man bei SourceForge kostenlos runterladen: http://sourceforge.net/projects/tortoisehg/files/

Sobald man es installiert hat, bekommt das Rechtsklick-Menü für Ordner einen neuen Eintrag "TortoiseHG", über den sich alle Funktionen von Mercurial ansteuern lassen. Die Möglichkeiten von Mercurial sind viel zu vielfältig, um sie hier alle zu erwähnen, aber ich werde mal auf die wichtigsten kurz eingehen, die man braucht, um es für die Adventure-Entwicklung zu nutzen:

Neues Repository anlegen
Wenn man mehrere Projekte separat voneinander entwickelt, will man natürlich nicht, dass Projekt A ebenfalls auf eine frühere Version zurückgesetzt wird, bloß weil man bei Projekt B Mist gebaut hat. Darum überwacht Mercurial nicht alle Dateien auf dem ganzen Rechner, sondern nur bestimmte Ordner, die man als sog. Repository eingerichtet hat. Alle Dateien und Unterordner in diesem Repository betrachtet Mercurial dann als zusammenhängendes Projekt. Um einen Ordner zum Repository zu machen, öffnet man den Ordner und rechtsklickt auf eine leere Stelle. Im TortoiseHG-Menü wählt man dann "Create Repository Here" und anschließend auf "Create".
Wenn man alles richtig gemacht hat, bekommt das Symbol des Ordners zusätzlich einen kleinen grünen Kreis mit einem Häkchen.

Dateien hinzufügen / Kontrollpunkte setzen
Mercurial überwacht nur die Dateien, die man ihm explizit zugewiesen hat. Das bedeutet, dass man in einem Repository z.B. temporäre Dateien liegen haben kann, deren Änderungen völlig irrelevant sind und die demnach auch nicht gespeichert werden müssen. Wenn man das Repository also für ein bestehendes Projekt neu angelegt hat, muss man erstmal alle zum Projekt gehörenden Dateien hinzufügen. Wenn man Dateien geändert hat, gilt das selbe Prinzip: Man muss nicht alle Änderungen gleich in den Kontrollpunkt übernehmen (vielleicht hat man zu Testzwecken irgendein Bild verändert, was nicht gespeichert werden soll etc). Also auch geänderte Dateien muss man für einen Kontrollpunkt explizit auswählen.
Das geht aber viel einfacher, als es sich anhört: Man rechtsklickt wieder in eine leere Stelle des Ordners und wählt dann "HG Commit...". Das öffnet das Commit-Menü, das zum Setzen von Kontrollpunkten dient. Im oberen Teil des Fensters befindet sich ein Eingabefeld, in dem man eine kurze Beschreibung eintippen kann, was man seit dem letzten Kontrollpunkt verändert hat. Das ist insbesondere später hilfreich, wenn man irgendwann einen Fehler findet, und herausfinden will, wo man den hinzugefügt hat.
Der untere Teil des Fensters besteht aus zwei Hälften: Links ist eine Liste aller Dateien, die sich seit dem letzten Kontrollpunkt geändert haben, neu hinzugekommen sind oder gelöscht wurden und rechts sieht man, was sich an der Datei geändert hat, die man gerade markiert hat. Das rechte Fenster ist für unsere Zwecke nur bedingt von Nutzen, da es nur für Klartext-Dateien sinnvolle Ausgaben liefert, aber links wählt man einfach alle Dateien an, deren Änderungen in den Kontrollpunkt aufgenommen werden sollen. Wenn man den kompletten Projektordner, so wie er ist, übernehmen will, kann man auch einfach das Häckchen ganz oben anklicken und somit alles markieren.
Sobald man eine Kurzbeschreibung eingetippt und alle Dateien ausgewählt hat, klickt man ganz oben links auf den blauen Pfeil und schon ist der Kontrollpunkt gesetzt.

Kontrollpunkte betrachten / wiederherstellen
Wenn man jetzt eine Zeit lang seine Änderungen eingetragen hat, passiert irgendwann der Super-GAU: Man hat an seinen Skripten rumgepfuscht und nix geht mehr. Dank Versionsverwaltung ist das jetzt kein Grund mehr zur Panik. Wenn der letzte gesetzte Kontrollpunkt noch funktioniert, rechtsklickt man einfach in den Ordner und wählt im TortoiseHG-Menü "Revert Files...". Damit kann man einzelne oder alle Dateien auf den letzten Kontrollpunkt zurücksetzen.
Es kommt aber hin und wieder auch vor, dass man auf einen früheren als den letzten Kontrollpunkt zurückspringen will. Beispielsweise, weil man eine frühe Version seines Spiels veröffentlicht und seitdem weiterentwickelt hat. Wenn jemand einen Bug in der veröffentlichten Version findet, den man in der aktuellen nicht nachvollziehen kann, kann man einfach vorübergehend auf den alten Kontrollpunkt zurückspringen. Das geht über den HG Repository Explorer, den man - wie alles andere auch - über einen Rechtsklick erreicht. Dort sieht man in chronologischer Reihenfolge alle Kontrollpunkte, die man in dem Repository je gesetzt hat, zusammen mit der ersten Zeile der Kurzzusammenfassung. Jetzt kann man einfach auf den gewünschten Kontrollpunkt rechtsklicken und "Revert" wählen, dann werden alle Dateien auf diesen Punkt zurückgesetzt. Will man wieder auf den aktuellen Zustand zurück, wählt man einfach wieder den neuesten Kontrollpunkt und macht ein Revert. Man sollte nur darauf achten, dass man seine Änderungen auch mit einem Kontrollpunkt versehen hat, bevor man zu einer alten Version zurückspringt. ;-)


All das kann man natürlich auch durch Kopieren des gesamten Ordners erreichen. Was also ist der Vorteil, der ein extra Programm rechtfertigt? Erst einmal wäre da der Speicherplatzbedarf. Kontrollpunkte in Mercurial benötigen nur Speicherplatz für Dateien, die sich auch tatsächlich geändert haben. Bei großen Projekten mit vielen Kontrollpunkten kann das schon einen gewaltigen Unterschied gegenüber einfachen Ordnerkopien machen.
Zweitens wäre da die Übersichtlichkeit. Wenn man tatsächlich jeden Tag ein Backup seines Projektordners macht, hat man nachher hunderte Ordner, die man im besten Fall noch mit Datum versehen hat. Man hat aber keine Ahnung, welche Änderung man wann gemacht hat. Besonders wenn man mal einfach ausprobieren will, ob bestimmte Dinge im Spiel funktionieren oder nicht und falls nötig zu einem Punkt vor diesem Versuch zurück will, ist das mit Mercurial viel bequemer.
Und damit wären wir auch schon beim dritten und wichtigsten Punkt: Die Bequemlichkeit. Die ist nämlich nicht zu unterschätzen. Wer hat schon Bock, jeden Tag (oder sogar mehrmals täglich) ein Backup von seinem Projektordner zu machen, das irgendwo hin zu schieben und mit dem aktuellen Datum zu benennen? Ein Rechtsklick geht da viel schneller. Es ist zwar immer noch mit einem gewissen Aufwand verbunden, aber zumindest für mich persönlich liegt es noch unterhalb der Nerv-Grenze. Mit Ordner kopieren wäre mir das schon zu stressig. Und gerade die Regelmäßigkeit ist das wichtige an der Sache. Die Arbeit eines Tages zu verlieren ist zwar nervig, aber zu verkraften. Wenn das letzte Backup einen Monat zurückliegt (oder man gar keins hat), ist man in der Regel so frustriert, dass man das Projekt hinschmeißt.

Mercurial eignet sich übrigens auch super für Webseiten oder lange Texte wie Hausarbeiten und besitzt selbstverständlich auch Möglichkeiten, Änderungen mehrerer Autoren bzw. Entwickler zusammenzuführen. Das klappt allerdings nur bei Klartext-Dateien wirklich gut, darum will ich das an dieser Stelle nicht weiter ausführen.

Ich hoffe, ich konnte irgendwem damit weiterhelfen oder vielleicht sogar das ein oder andere Spiel vor einem vorzeitigen Ende bewahren. ;-)

Schiman
PaC-DK God
Posts: 1177
Joined: 20 Dec 2006, 21:48
Contact:

Post: # 75032Post Schiman
20 Jan 2010, 20:52

Super... Vielen Dank für den Hinweis. Ich habe mir auch schon überlegt nach so einem Programm zu suchen. Bisher habe ich wirklich den gesamten Projektordner (echt ne Menge Daten :mrgreen: ) auf meine Externe Festplatte kopiert. Und um auch noch auf frühere Versionen zugreifen zu können, habe ich die Daten auf der Externen nicht überschrieben, sondern immer wieder neu kopiert, mit dem Ergebnis, dass jetzt viele GB doppelt und dreifach kopierter daten auf der Platte liegen... Extrem sinnlos.

Kann Mercurial auch mit externen Platten arbeiten?

Benni
Tutorial Reader
Posts: 65
Joined: 09 Jan 2009, 23:38

Post: # 75033Post Benni
20 Jan 2010, 22:16

Ja, das geht auch. In dem Fall legst du einfach ein zweites Repository auf der externen Platte an, das du mit deiner lokalen Version synchronisierst. Sagen wir mal, das Arbeitsverzeichnis deines Projekts liegt auf C:\Projekt und du willst es auf der externen sichern unter E:\ProjektBackup. Dazu musst du auf der externen Festplatte zunächst ein leeres Repository unter E:\ProjektBackup anlegen. Du erstellst also den Ordner, rechtsklickst und wählst TortoiseHG -> Create Repository Here.

Von nun an kannst du alle Änderungen an deinem Arbeits-Repository (also C:\Projekt) bequem über den Repository-Explorer mit dem Backup-Repository synchronisieren: Du öffnest also dein Arbeitsverzeichnis unter C:\Projekt, rechtsklickst und wählst "HG Repository Explorer". In der Eingabezeile ganz oben trägst du dann den Pfad deines Backup-Repositorys ein, also E:\ProjektBackup, und klickst dann auf das Symbol mit dem Pfeil der nach oben auf eine waagerechte Linie zeigt ("Push outgoing changesets"). Das bewirkt, dass alle neuen Kontrollpunkte in deinem Arbeitsverzeichnis dem Backup hinzugefügt werden. Den Pfad zum Backup-Verzeichnis merkt er sich übrigens, den musst du nur einmal angeben.

Sollte deine interne Platte irgendwann mal das Zeitliche segnen, kannst du einfach ein neues leeres Repository anlegen, den Repository Explorer öffnen und dein Backup-Verzeichnis angeben. Mit einem Klick auf das Icon mit dem Pfeil, der nach unten auf eine waagerechte Linie zeigt (Pull incoming changesets), ziehst du alle Kontrollpunkte aus dem Backup in das neue Repository rüber. Anschließend musst du nur noch auf den neuesten Kontrollpunkt rechtsklicken und "Update" wählen, dann werden auch die Dateien entsprechend wiederhergestellt.

Was dich dabei vielleicht verwirren könnte ist, dass das Backup-Verzeichnis leer zu bleiben scheint bzw. nur einen Ordner namens ".hg" enthält. Das liegt daran, dass die Dateien bzw Änderungen in komprimierter Form gespeichert sind und nur auf Wunsch zum Bearbeiten in den Ordner extrahiert werden. Schließlich enthält dein Backup ja nicht nur die aktuellste Version deiner Dateien, sondern auch alle vorherigen Versionen. Wenn du der Sache nicht traust und sicherstellen willst, dass tatsächlich auch alles da ist, kannst du die Dateien aber genau wie oben beschrieben über den Repository Explorer und "Update" wiederherstellen lassen.

Dein Arbeitsablauf wäre also (nachdem du das Repository auf der externen eingerichtet hast) wie folgt: Du änderst was am Spiel, setzt einen Kontrollpunkt (Commit), änderst wieder was, setzt wieder einen Kontrollpunkt, bis du beschließt dass es Zeit ist, es auf der externen zu sichern. Dann stöpselst du die Platte ein, öffnest den Repository Explorer und klickst auf das Push-Symbol.


Schiman
PaC-DK God
Posts: 1177
Joined: 20 Dec 2006, 21:48
Contact:

Post: # 75046Post Schiman
23 Jan 2010, 11:01

Noch ne Frage zu Mercurian.
Benni wrote:Wenn man das Repository also für ein bestehendes Projekt neu angelegt hat, muss man erstmal alle zum Projekt gehörenden Dateien hinzufügen.
Wie füge ich denn alle zum Projekt gehörenden Dateien hinzu? Einfach reinkopieren kanns ja nicht sein, oder?

Benni
Tutorial Reader
Posts: 65
Joined: 09 Jan 2009, 23:38

Post: # 75048Post Benni
23 Jan 2010, 16:52

Das geht alles über das Commit-Menü. Die Dateien müssen sich in dem Ordner befinden, den du zum Repository gemacht hast (oder in einem Unterordner) und dann musst du einfach nur den ersten Kontrollpunkt setzen und alle Dateien auswählen, die hinzugefügt werden sollen.

Schiman
PaC-DK God
Posts: 1177
Joined: 20 Dec 2006, 21:48
Contact:

Post: # 75053Post Schiman
24 Jan 2010, 16:12

Mercurial ist cool. Damit habe ich endlich keine Sicherungsprobleme mehr^^.

Ne kleine Frage noch:
Dateien, die gut in der Versionsverwaltung drin sind, sind ja mit so nem grünen Häkchen ausgestattet. Wenn man irgendwo was ändert, wird das Häkchen entsprechend zu einem roten Ausrufezeichen.

Bei einem Commit müsste doch eigentlich alles wieder grün werden. bei mir bleiben aber einige Ordner mit dem roten Ausrufezeichen, obwohl deren Inhalt komplett mit grünen Häkchen ausgestattet ist.
Hat das eine Bedeutung oder ist das Programm einfach noch nicht ganz so schnell beim Aktualisieren?

Benni
Tutorial Reader
Posts: 65
Joined: 09 Jan 2009, 23:38

Post: # 75056Post Benni
24 Jan 2010, 17:50

Wenn alle Dateien in dem Ordner mit grünem Häkchen markiert sind, müsste eigentlich alles in Ordnung sein. Es kann schon sein, dass der manchmal nicht so schnell aktualisiert, vielleicht hilft es mal F5 zu drücken. Eine verlässliche Übersicht, welche Dateien bzw Änderungen noch nicht committed sind, erhältst du aber über die Liste im Commit-Menü. Die ist auf jeden Fall aktuell.

Post Reply