GIT

From EQdkp Plus
Jump to navigation Jump to search


Vor einiger Zeit haben von SVN zu GIT gewechselt, was unser Versionsverwaltungssystem betrifft. Dort sind immer die neuesten Änderungen enthalten.

Aufbau des GitHub-Repos

Der Core von EQdkp Plus ist im core-Repo zu finden. Alle anderen Repos tragen meist ein Prefix.

  • plugin- Ist ein Plugin
  • portal- Ist ein Portalmodul
  • game- Ist ein Spiel
  • misc- Sonstiges, wie einige Helpersachen
  • tool- Sonstiges, hilfreiche Tools

Änderungen an den Repos verfolgen

https://eqdkp-plus.eu/repository/github?show=core,plugin-dynamictemplate​

(Alle Daten werden alle 10 Minuten aktualisiert)

GIT-Client

Wie auch bei SVN, benötigt man bei GIT einen Client, mit dem man die Sachen aus dem Repository holen kann.

Bitte achtet auch darauf, dass ihr die jeweilige Version herunterladet, die zu eurem Betriebssystem passt (32/64 bit).

Branches

Wir arbeiten mit mehreren Branches.

  • master Enthält die aktuelle Entwicklung, also auch nicht-fertigen Code
  • eqdkp_1.0 Enthält die 1.0 Entwicklung
  • eqdkp_2.0 Enthält die 2.0 Entwicklung
  • ... weitere Branches hängen vom jeweiligen Repository ab.

Releases

Releases stellen fertige Entwicklungsstände dar und enthalten in der Regel stabilen Code. Diese Releases werden dann auch in unseren Download-Bereich gestellt.

Arbeiten mit GIT

Im folgenden wird nun beschrieben, wie man mit GIT arbeitet. Es wird dabei unterschieden zwischen den Testern, die nichts schreiben müssen, und den Entwicklern, die eigene Repos im EQdkp-Plus Universum haben, bzw. mit ihren eigenen Forks arbeiten.

Nur Lesend auf die GIT-Repos zugreifen

Dies betrifft vor allem die Tester, die keinen Schreibzugriff auf die Repos haben und vorrangig Bugs im Bugtracker melden, ohne eigene Änderungen am Code vornehmen.

Repository klonen

Jedes Repository hat einen eigenen Link, womit man die Repository klonen kann, beispielsweise https://github.com/EQdkpPlus/game-daoc.git. Ein Repository kann in ein beliebiges Verzeichnis auf dem PC geklont werden. Das klonen wird über den jeweiligen GIT-Client durchgeführt.

Allerdings sind die einzelnen Repositories eigenständig, d.h. um sie auch im core zu haben, muss man diese manuell oder mit Hilfe des repohelpers in den core kopieren.

Submodules.JPG

Einfacher geht es, wenn man im core sogenannte Submodule anlegt. Dies wird nun im Folgenden für Tortoise-GIT beschrieben:

  • Gehe im core in den Ordner, wo das Submodul erstellt werden soll, z.B. templates, da man template-eqdkp_luna als Submodul hinzufügen will
  • Rechtsklick -> TortoiseGit -> "Submodules Add"
  • Als Path folgendes eintragen: template\eqdkp_luna (\eqdkp_luna muss manuell eingetragen werden)
  • "Force" / "Erzwingen" aktivieren
  • Auf OK klicken

Damit ist das Submodul eingerichtet.


Repository aktuell halten

Um ein Repository aktuell zu halten, muss man das Repo manuell aktualisieren. Dazu macht man einen Rechtsklick auf das Repository und macht Pull bzw. Fetch.

Submodule müssen auch aktuell gehalten werden. Dazu macht man

  • Rechtsklick auf den Ordner, der die Submodule enthält, also z.B. templates -> TortoiseGit -> "Submodule Update"
  • Auswählen von allen Submodulen oder nur den gewünschten

Schreibend auf die GIT-Repos zugreifen

Um schreibend auf dein GitHub-Repo zugreifen zu können, wird zunächst ein GitHub-Account benötigt. Außerdem hängt es davon ab, ob ihr direkte Schreibzugriff auf ein EQdkp Plus-Repo besitzt, oder ihr Änderungen an eurem Fork machen und per Pull Request an uns zurücksenden müsst.

Direkte Schreibrechte auf ein EQdkp Plus-Repo

Hat man direkt Schreibrechte auf ein EQdkp Plus-Repo, verwendet man die direkte URL zum EQdkp Plus Repo, z.B. https://github.com/EQdkpPlus/game-daoc.git. Im geklonten Repo bzw. Submodul nimmt man dann direkt die Änderungen am Code vor. Anschließend hat man ein zweistufiges Commit-System.

  • Commit Legt einen lokalen Commit mit deinen Änderungen an
  • Push Lädt die lokalen Commits auf GitHub hoch. Erst ab jetzt haben andere Zugriff auf die Änderungen und können ihr Repo aktualisieren

Keine direkten Schreibrechte auf ein EQdkp Plus-Repo (Fork notwendig)

Repo forken

Als erstes müsst ihr das gewünschte Repository forken. Dazu geht ihr auf Github, z.B. https://github.com/EQdkpPlus/game-lotro und benutzt den Fork-Button oben rechts. Dabei wird das aktuelle Repository so wie es ist in euren Account kopiert. Zukünftige neue Änderungen werden nicht automatisch in eurem Repository auftauchen.

Repo klonen

Als nächstes müsst ihr das Repository was ihr gerade auf Github erstellt auf euren Computer klonen. Die Clone-URL dafür steht auf der Github Seite des jeweiligen Repositories. Bitte achtet darauf, dass ihr wirklich die URL eures Forkes verwendet, und nicht die URL des EQdkp Plus-Repos, denn ihr habt ja nur auf euren eigenen Fork entsprechende Schreibrechte.

Änderungen aus originalem Repository kopieren

Um Änderungen die nach eurem Fork im originalen Repository (Remote genannt) gemacht wurden in euer Repository zu übernehmen, müsst ihr einen Git Pull machen. Dazu macht ihr einfach einen Rechtsklick im gewünschten Repository -> TortoiseGit -> Pull. Dort wählt ihr dann das gewünschte Remote aus (wo die gewünschten Änderungen enthalten sind) und anschließend noch den Remote-Branch. Allerdings werden dort nur euer eigenes Remote oder solche angezeigt, die ihr manuell eingetragen habt. Um weitere Remotes hinzuzufügen, geht ihr einfach in euren Ordner, Rechtsklick -> TortoiseGit -> Settings -> Git -> Remotes. Dort tragt ihr einfach die Daten ein und drückt dann auf "Add New/Save". Zum Beispiel könnt ihr so EQdkp als Remotes hinzufügen:

Die Daten dafür findet ihr sonst auch wieder auf den jeweiligen github Seiten.

Änderungen zusammenführen

In den meisten Fällen führt git pull automatisch zu einer Änderung der lokalen Dateien - die Änderungen aus den anderen Repositories werden automatisch übernommen. Genau genommen wird an dieser Stelle ein git merge vorgenommen, d.h. Änderungen an der selben Datei in verschiedenen Repositories werden automatisch zusammengeführt in eine neue Datei mit allen Änderungen. Es ist ebenfalls möglich mehrere eigene Entwicklungszweige auf die gleiche Weise wieder zusammenzuführen und so z.B. Tests erst mal in einem Nebenzweig durchzuführen bevor man sie in den Hauptzweig übernimmt. Manchmal führt das Zusammenfügen von Änderungen zu Konflikten. Dies kann z.B. dann passieren, wenn mehrere Änderungen die gleiche Zeile betreffen oder wenn eine Binärdatei in mehreren zusammenzuführenden Zweigen geändert wurde. In dem Fall kann Git nicht entscheiden, was die "richtige" Version ist und es meldet stattdessen einen Konflikt. Tortoise Git bietet allerdings bei einem Doppelklick auf die gemeldete Datei eine Übersicht, in der man beide Versionen der Datei begutachten kann und auf diese Weise für jede Zeile individuell entscheiden kann, welche Variante korrekt ist um den Konflikt auf diese Weise aufzulösen. Anschließend kann man per git commit die Änderungen übernehmen.

Änderungen einpflegen (Commit)

Nun, da alle Änderungen in euer Repository übernommen wurden, könnt ihr die Dateien wie gewünscht ändern. Wenn ihr fertig damit seid, macht ihr einen so genannten Commit, Rechtsklick > git commit. Damit sind die Änderungen aber bisher nur auf eurem Computer. Um sie nun auch auf euren Github-Account zu übertragen müsst ihr nun einen Push machen, Rechtsklick > TortoiseGit > git push.

Änderungen vorschlagen (Pull Request)

Wenn ihr nun die Änderungen in eurem Repository gemacht habt, aber auch wollt das die Änderungen im Spiel von EQdkp Plus enthalten sind, müsst ihr einen sogenannten Pull-Request schicken. Dazu geht ihr einfach auf die Seite eures Repositories, in meinem Fall also https://github.com/godmod/game-lotro und drückt dort auf Pull Request. Anschließend könnt ihr noch den Branch auswählen, in welchem ihr die Änderungen habt und wo sie im Repository von EQdkp eingepflegt werden sollen. Im Falle des Lotro-Spiels wäre das der Branch master oder dev-2.0. Wir werden dann eure Änderungen kontrollieren und wenn alles in Ordnung ist in das Repository mergen. Wenn die Änderungen gemerged wurden, müsst ihr diese dann wieder wie im Abschnitt Änderungen aus anderen Repositories kopieren beschrieben in euer Repository kopieren.

Tags erstellen

Tags sind dafür da, besondere Commits zu kennzeichnen. In der Regel verwendet man dies, um Release Versionen zu taggen. Tags können dabei sowohl aus branches, als auch aus dem Master erstellt werden. Mit dem git tag Befehl oder dem entsprechenden GUI-Button lässt sich so ein Tag erstellen. Man sollte den Tag nach der neuen Version benennen, also z.B. '1.0.7-beta2' oder '1.0.9-rc1' oder '1.0.10'.

Create a tag.JPG

Im Folgenden eine Anleitung, um mit Tortoise-GIT Tags zu erstellen, z.B. für eqdkp_luna:

  • Gehe auf den Ordner "templates/eqdkp_luna" -> Rechtsklick -> TortoiseGit -> "Markierung erstellen" / "Create Tag"
  • Trage oben den Namen ein z.B. 0.0.1. Weiter unten sind weitere Optionen die hier (Link für einen Post über Branches und Tags) zur Anwendung kommen
  • Klicke auf OK

Damit ist der Tag zwar erstellt, doch nur lokal, so dass dieser noch gepush werden muss.

  • Gehe auf den Ordner "templates/eqdkp_luna" -> Rechtsklick -> TortoiseGit -> "Versenden" / "Push"
  • Aktiviere "Include Tags" / "Inklusive Markierungen"

GIT-Befehle

Clone

Bei clone wird ein lokales Repository des angegebenen EQdkp-Plus Repositorys angelegt, mit dem man dann arbeiten kann. Wenn man keine Schreibrechte hat, sollte man für Änderungen vorher einen Fork über Github anlegen und diesen Klonen.

Checkout

Mit checkout lässt sich einerseits der Branch wechseln, oder auch einzelne Dateien bzw. Verzeichnisse auf ihren originalzustand zurückzusetzen. Dabei muss entweder einfach im Anschluss an den Befehl der Branch oder eben die Dateien/Verzeichnisse angegeben werden.

Fetch

Durch fetch werden alle Änderungen des geklonten Repository auf dem aktuell gewählten Branch seit dem Klonen bzw. letzten Pull heruntergeladen.

Merge

Ein merge ist nötig, um die durch fetch heruntergeladenen Änderungen am Code in das lokale Repository zu bekommen. Falls lokale Änderungen an Dateien bestehen, kann es hierbei zu Konflikten kommen, die dann händisch behoben werden müssen, um den merge abschließen zu können.

Pull

Beim pull wird ein fetch mit einem merge kombiniert.

Add

Durch add lassen sich einzelne Dateien oder ganze Ordner für einen Commit vormerken. Um einen Commit anzulegen, müssen vorher alle Dateien darüber entsprechend vorgemerkt sein.

Commit

commit erzeugt auf deinem lokalen Repository einen neuen Commit mit allen Änderungen, die zuvor per add vorgemerkt wurden.

Push

Mit push werden zum Schluss noch alle angelegten Commits deines lokalen Repositorys an das geklonte Repository übertragen. Dazu benötigt man Schreibrechte.