Fryboyter

Git - Bereits gesendete Commits zusammenfassen

Ich habe an mehreren Dateien in einem Git-Repository jeweils die gleiche Änderung durchgeführt. Hierfür habe ich pro Datei einen Commit erstellt und diese bereits zu Github übermittelt. Ein Commit hätte es in dem Fall auch getan. Wie kann man nun nachträglich die betreffenden Commits zu einem Commit zusammenfassen?

Als Erstes führt man im lokalen Arbeitsverzeichnis git rebase -i HEAD~X aus. Anstelle von X gibt man die Anzahl der letzten Commits an, die man zusammenfassen möchte.

Nun sollte automatisch ein Editor geöffnet werden und in den ersten Zeilen sollte man beispielsweise folgendes vorfinden.

pick 67426ab Commit-Nachricht
pick 56432tz Commit-Nachricht
pick 45643io Commit-Nachricht

Um aus diesen drei Commits einen Commit zu machen, ersetzt man in Zeile 2 und 3 das pick mit squash. Das “pick” in der ersten Zeile wird nicht geändert. Abschließend speichert man das ganze ab.

Nun sollte erneut ein Editor geöffnet werden in dem man bei Bedarf die Commit-Nachricht anpassen kann. Da ich für alle drei Commits die gleiche Nachricht genutzt hatte, habe ich keine Änderungen vorgenommen.

Abschließend führt man noch git push –force origin HEAD aus, um die Änderungen an Github zu senden. Sollte man einen anderen Alias für das Repository genutzt haben (origin ist Standard) muss man den Befehl entsprechend anpassen. Wer sich nicht sicher ist, kann in der Datei config im Verzeichnis .git nachsehen das im lokalen Arbeitsverzeichnis zu finden ist.

Sofern man nicht die einzige Person ist, die an den Dateien Änderungen vornimmt, sollte man anstelle –force besser –force-with-lease nutzen.

Schaut man sich nun die Historie des Repository an, wurden die betreffenden Commits zu einem Commit zusammengefasst.

OSBN

Git - Nicht übergebene Änderungen rückgängig machen

Gestern habe ich begonnen Änderungen in einem Repository auf meinem Notebook durchzuführen. Die bisherigen Änderungen habe ich allerdings noch nicht mit einem Commit gepflegt.

Da ich die Änderung heute schnellstmöglich einpflegen wollte, habe ich die Änderungen kurzerhand komplett auf einem anderen Rechner durchgeführt und einen entsprechenden Commit erstellt und diesen hochgeladen.

Eben wollte ich die Kopie des Repository auf meinem Notebook mit git pull aktualisieren. Das Ergebnis war allerdings folgende Fehlermeldung.

git pull
error: Pull mit Rebase nicht möglich: Sie haben Änderungen, die nicht zum Commit vorgemerkt sind.
error: Bitte committen Sie die Änderungen oder benutzen Sie "stash".

Da ich ziemlich viel getestet hatte, habe ich mir erst einmal mit git status angesehen um welche Dateien es überhaupt geht. Eine der Dateien war style.css. Nach etwas Recherche bin ich auf git restore gestoßen. Mittels folgendem Befehl habe ich die Änderungen in der Datei style.css kurzerhand rückgängig machen können.

git restore themes/fryboyter/static/css/style.css

Das Ganze habe ich dann auch auf die restlichen geänderten Dateien angewandt und konnte dann die bereits eingepflegten Änderungen mit git pull herunterladen.

OSBN | Allgemein

Repository mit Submodulen klonen

Ich habe eben ein Repository bei Github auf einen meiner Rechner geklont und festgestellt, das ein Teil der Daten nicht vorhanden ist. Was daran lag, dass der fehlende Teil als Submodul eingebunden ist. Die Daten liegen also in einem anderen Repository. Um ein Projekt inklusive der Submodule zu klonen, kann man folgenden Befehl nutzen.

git clone --recursive <LINK-ZUM-REPOSITORY>

Was aber, wenn man das Hauptprojekt bereits geklont hat? Man wechselt einfach in das Verzeichnis und führt folgende Befehle aus. Hiermit werden nachträglich auch die Dateien der Submodule heruntergeladen.

git submodule init
git submodule update
OSBN | Allgemein

Git zu Mercurial konvertieren

Oft kommt es vor, dass jemand von einer Versionsverwaltung zu Git wechselt. Ab und zu kommt es aber auch vor, dass jemand von Git auf eine andere Lösung wechseln will. Kürzlich hatte ich solch eine Anfrage. Gewünscht war Mercurial.

Das betreffende Git-Repository war noch recht frisch aber es gab bereits Commits im niedrigen dreistelligen Bereich. Zu viele um diese in Mercurial manuell anzulegen.

Was aber gar nicht nötig ist. Mercurial bietet die Möglichkeit der Konvertierung an.

Nehmen wir einmal an im Home-Verzeichnis gibt es das Verzeichnis repository. In diesem befindet sich das Verzeichnis blog.git in welchem das Git-Repository vorhanden ist.

Als erstes erzeugt man im Verzeichnis repository das Unterverzeichnis blog.hg und wechselt in dieses. Dort erzeugt man dann mittels “hg init” ein Mercurial-Repository. Hierbei wird das Verzeichnis .hg erstellt. In diesem erzeugt man die Datei hgrc mit folgendem Inhalt.

[extensions]
hgext.convert=

Hiermit aktiviert man die Erweiterung, mit der man die Konvertierung vornehmen kann.

Nun führt man im Verzeichnis blog.hg folgenden Befehl aus.

hg convert --datesort ~/repository/blog.git ~/repository/blog.hg

Das ganze dauert dann etwas. Aber wenn alles geklappt hat, sollte man ein Mercurial-Repository mit allen Commits, Dateien usw. wie im Git-Repository erhalten. Sieht man sich das Verzeichnis blog.hg an, sieht man allerdings weiterhin nur das Unterverzeichnis .hg. Das Problem behebt man in dem man den Befehl “hg update” ausführt. Sieht man sich danach das Verzeichnis blog.hg an, sieht man auch die ganzen Dateien, die man ursprünglich zum Git-Repository hinzugefügt hat.

OSBN | Allgemein

Fryboyter wird nun mit Hugo erzeugt

Bisher habe ich für fryboyter.de das CMS Bolt verwendet. Im Grunde bin ich damit auch zufrieden. Aber irgendwie habe ich in letzter Zeit immer weniger Lust die Updates zu installieren.

Daher habe ich mir in den letzten Wochen diverse Tools angesehen, mit denen man statische Webseiten erstellen kann. Man braucht also kein PHP, keine Datenbank usw. Somit entfällt auch das nervige Updaten der Seite.

Schlussendlich bin ich bei Hugo gelandet. Das hat im Grunde zwei Gründe. Zum einen besteht Hugo nur aus einer Datei und zum anderen werden die statischen Seiten sehr schnell erzeugt.

Was mich aber etwas beschäftigt hat, war wie ich die Seite bei neuen Artikeln möglichst einfach erzeugen und auf den Webspace hochladen kann.

Im Lab von Uberspace gibt es inzwischen eine Anleitung wie man Hugo installiert. Hierbei läuft Hugo als Dienst im Hintergrund und erzeugt die Seite neu, sobald sich etwas geändert hat. Was aber zur Folge hat, dass ich mich wieder zeitnah um eventuelle Updates kümmern muss. Besser wäre es, wenn Hugo nur zum Erzeugen der Seite gestartet und danach wieder beendet wird. Das einfachste wäre es, sich per SSH mit dem Webspace zu verbinden, den neuen Artikel zu erstellen und dann Hugo manuell auszuführen. Einfach? Ja. Umständlich? Auf jeden Fall. Also kommt es auch nicht infrage.

Die Lösung lautet, wie so oft, Git. Als Erstes legt man auf dem Webspace außerhalb des Document Root ein Verzeichnis an. In diesem erzeugt man mittels “git init –bare” ein sogenannte Bare-Respository. Dies hat, im Gegensatz zu einem normalen Respository keinen Working Tree. Schaut man sich nun das Verzeichnis noch einmal an, findet man dort das Unterverzeichnis “hooks”. Mit diesen Hooks lassen sich bestimmte Dinge automatisieren. Zum Beispiel lassen sich Befehle ausführen, wenn das Repository neue Daten erhalten hat. Hierfür legt man im Verzeichnis “hooks” die Datei post-receive an und befüllt diese beispielsweise wie folgt und macht diese dann noch ausführbar.

GIT_REPO=$HOME/repository/fryboyter.git
TMP_GIT_CLONE=$HOME/tmp/git/fryboyter
PUBLIC_WWW=/var/www/virtual/$USER/html/fryboyter
git clone $GIT_REPO $TMP_GIT_CLONE
~/bin/hugo -s $TMP_GIT_CLONE --cleanDestinationDir -d $PUBLIC_WWW
rm -Rf $TMP_GIT_CLONE
exit

Hiermit wird der Inhalt des Repository in ein temporäres Verzeichnis geklont. Danach löscht Hugo die bereits veröffentlichte Internetseite und erstellt diese neu. Anschließend wird das temporäre Verzeichnis gelöscht.

Was jetzt noch fehlt, sind die Daten mit denen man die Internetseite erzeugt. Diese erzeugt man auf dem eigenen Rechner. Wenn dies erledigt ist, wechselt man in das betreffende Verzeichnis und führt folgende Befehle aus.

git init
git add .
git commit -m "Beschreibung des Commit"

Hiermit erstellt man ein lokales Repository, fügt alle Dateien des Verzeichnisses hinzu und erstellt einen Commit. Läde man das ganze mittels “git push $adresse_des_repository” hoch wird automatisch die Datei post-receive ausgeführt und die Internetseite wird automatisch erzeugt. Um zukünftig die Seite zu aktualisieren, erzeugt / ändert man die betreffende Datei im lokalen Repository, erstellt einen neuen Commit und lädt die Änderungen mittels git push hoch.

OSBN | Allgemein