Skip to content

6_Änderungen von PK Repo ins linked.swissbib Repo übernehmen

marahellstern edited this page Mar 24, 2017 · 1 revision

!!! Diese Seite wurde als Hilfsseite während der Entwicklung erstellt und enthält gegebenfalls veraltete Angaben! !!!

Einleitung

Diese Seite beschreibt, wie wir Änderungen vom PK-Repo in dieses Repo übernehmen können. Allgemein gesprochen möchten wir ein cherry-pick auf ein remote repository durchführen. Annahme ist, dass wir auf der virtuellen Maschine arbeiten, welche wir auch den Studenten zur Verfügung gestellt haben.

Die Anleitung ist unterteilt in zwei Schritte:

  1. Einmalige Einrichtung: Diese müssen nur einmal pro VM durchgeführt werden.
  2. Sich wiederholende Schritte: Diese müssen für jede Änderung, welche übernommen werden soll, wiederholt werden.

Einmalige Einrichtung

remote hinzufügen

Auf der virtuellen Maschine wird ein neues sog. remote mit dem Namen lsb (zusätzlich zum bestehenden origin) konfiguriert. Dieses entspricht dem linked-swissbib/vufind Repo:

cd /usr/local/vufind/httpd
git remote add lsb https://github.com/linked-swissbib/vufind.git

Branches von lsb herunterladen

git fetch lsb

Neuen Branch upstream anlegen, welcher verknüpft ist mit linked-swissbib Branch vfsb/linked:

git branch upstream lsb/vfsb/linked

Sich wiederholende Schritte

VirtualBox Snapshot

An dieser Stelle kann ein VirtualBox Snapshot nicht schaden.

Verzeichnis wechseln

Ins richtige Verzeichnis wechseln:

cd /usr/local/vufind/httpd

Branch der Studenten auswählen

git checkout vfsb/linked

Neueste Änderungen vom PK-Repo herunterladen:

git pull

Commit-Hash(es) bestimmen

Commit-Hash bestimmen, welcher übernommen werden soll: Über https://github.com/htw-pk15/vufind/commits/vfsb/linked oder mit

git log

bzw.

git show

Sollen mehrere Commits übernommen werden, alle notieren und im weiteren Verlauf mit dem ältesten Commit beginnen. Dabei ist zu beachten, dass Merge-Commits nicht notiert werden sollen. (Merge commits entstehen u.a. dann, wenn man in ein Repo pushen möchte, jemand einem aber zuvorgekommen ist und man deshalb git pull ausführt.)

Zum Branch upstream wechseln

git checkout upstream

Neuste Änderungen vom linked-swissbib/vufind Repo beziehen

git pull

Cherry-picken

git cherry-pick -n -x 1111111 # ältester commit zuerst
  • -n : Commit nicht sofort ausführen
  • -x : Commit-Hash, welcher cherry-picked wurde, in der Commit-Nachricht notieren

Falls eine Fehlermeldung im Stil von error: could not apply 1111111... auftritt, konnte der cherry-pick nicht fehlerfrei durchgeführt werden, da eine oder mehrere Dateien bereits im linked-swissbib/vufind Repo geändert wurden. In diesem Fall müssen Merge-Konflikte aufgelöst werden, siehe dazu separaten Abschnitt in diesem Dokument. Im Fall, dass alles gut läuft, weiterlesen im Abschnitt "Änderungen committen".

Cherry-pick abbrechen

Möchte man nicht fortfahren, kann alternativ der cherry-pick abgebrochen werden mit:

git cherry-pick --abort

Dateien, welche durch den cherry-pick Versuch geändert wurden, können mit

git reset HEAD dateiname

zurückgesetzt werden. Welche Dateien betroffen sind, zeigt der Befehl:

git status

Fehlermeldung Commit 111111 ist ein Merge, aber die Option -m wurde nicht angegeben.

Diese Fehlermeldung tritt auf, wenn versucht wurde, ein Merge-Commit zu cherry-picken. Ein Merge-Commit ein einer, welcher mehrere Vorgänger hat. Bei einem solchen Commit weiss git beim cherry-picken nicht, zu welchem Vorgänger-Stand (-Hash) er einen Patch/Diff erstellen soll, da der Commit ja mehrere Vorgänger hat. Merge-Commits sollten aber sowieso nicht cherry-picked werden (siehe oben). Wir müssen uns für einen Vorgänger entscheiden, mittels welchem der Patch erstellt werden soll. Dafür dient die Option -m. Hier kann aber nicht direkt ein Commit angegeben werden, sondern es muss eine sogenannte Parent-Nummer angegeben werden. (Bei einem Merge sind die zusammengeführten Commits die Parents und diese sind durchnummeriert.)

Mittels git log können wir einsehen, welche Parents der Commit hat, welchen wir cherry-picken wollen. (Sichtbar bei der Zeile, welche mit Merge: beginnt. Der erste vorkommende Commit hat die Nummer 1, die weiteren sind einfach hochgezählt. Wenn wir vorher schon einen Commit gecherry-pickt haben, der jetzt in dieser Liste der Parents vorkommt, so wählen wir diesen commit (bzw. dessen parent-Nummer).

Entsprechend lautet dann der durchzuführende Befehl: git cherry-pick -m Z -n -x 1111111 # Z = parent-Nummer

Das durchgestrichene Vorgehen ist problematisch und das entsprechende Verhalten von git nicht-intuitiv. Siehe http://stackoverflow.com/a/9229393 (inkl. den niedrig-bewerteten Kommentaren).

Änderungen committen

git commit

Änderungen pushen

git push lsb HEAD:vfsb/linked

Cherry-Picken weiterer Commits

Sofern mehr als ein Commit cherry-picked werden soll, nochmals zum Befehl git cherry-pick zurückkehren und die Schritte wiederholen.

Wechsel zum vfsb/linked Branch

git checkout vfsb/linked

Merge-Konflikte auflösen

Es kann sein, dass ein cherry-pick nicht sauber angewandt werden kann. Das ist dann der Fall wenn der Vorgängerzustand vom gewünschten Commit nicht demjenigen Zustand entspricht, auf welcher der cherry-Pick angewandt werden soll. In diesem Fall gibt es in einer oder mehreren Dateien einen Merge-Konflikt, welcher manuell aufgelöst werden muss.

Situation analysieren

Mit dem Befehl

git status

werden unter both modified: die vom Merge-Konflikt betroffenen Dateien aufgelistet.

Konflikt beheben (Variante 1)

Jede betroffene Datei wird mit einem Text-Editor (nano, PhpStorm, gedit, ...) geöffnet. An mindestens einer Stelle wird ein Marker mit folgendem Aufbau sichtbar sein:

<<<<<<< HEAD
Variante 1
=======
Variante 2
>>>>>>> 1d2afb7fd96200cf2c2abebeaa86247f443e9e8c

Alle Zeilen, welche <, > oder = enthalten, müssen gelöscht werden. Ebenfalls gelöscht werden muss diejenige Variante, welche nicht erwünscht ist. Zurück bleibt also nur diejenige Variante welche erwünscht ist. Anders gesagt: Die Text-Datei muss so abgeändert werden, damit sie so aussieht, wie sie neu abgelegt werden soll. Im Extremfall kann das auch heissen, dass Text von Variante 1 und Variante 2 kombiniert werden muss.

Konflikt beheben (Variante 2)

Normalerweise können wir davon ausgehen, dass wir die gecherry-pickte Variante der aktuell vorliegenden Variante vorziehen möchten. Dies machen wir mit dem Befehl:

git checkout --theirs meinedatei

Dadurch wird die cherry-pick Variante der entsprechenden Datei ins working directory kopiert. Das Ergebnis ist dasselbe, wie wenn wir die Variante 1 der Konfliktbehebung durchführen (und dabei jeweils die cherry-pick Variante wählen). Der Vorteil von Variante 2 der Konfliktbehebung ist jedoch, dass keine "Handarbeit" an der Datei vorkommt. So sollten anschliessende cherry-picks sauber auf dieser Datei aufbauen können.

Konflikt-Behebung kennzeichnen

Um zu kennzeichnen, dass der Konflikt behoben ist, wird die betroffene Datei mittels

git add meinedatei

zur Staging Area hinzugefügt.

Achtung Dieser Schritt darf erst durchgeführt werden, wenn der Konflikt tatsächlich behoben worden ist. Andernfalls werden die Marker ebenfalls in Git abgelegt und Chaos bricht aus...

Die Behebung der Konflikte muss nun für jede Datei wiederholt werden. Anschliessend kann mit git commit der cherry-pick commitet (und anschliessend gepusht) werden.