MySQL-Datenbank-Abbild in Git Commit aufnehmen (pre-commit hook)

Git (Symbolbild)

Git (Symbolbild) – Git Logo by Jason Long is licensed under the Creative Commons Attribution 3.0 Unported License.

Die Versionsverwaltung Git ist für die Entwicklung von Webprojekten super praktisch, denn damit kann man zu einem beliebigen Zeitpunkt gewissermaßen einen Schnappschuss des aktuellen Standes anfertigen und bei Problemen auf diesen zurückrollen. Allerdings sichert Git nur die Dateien im Projektordner und nicht die – bei vielen Projekten involvierte – MySQL-Datenbank. Mit einem so genannten pre-commit hook und einem kleinen Shell-Skript lässt sich aber auch dieses Problem lösen. Hier zwei beispielhafte Lösungen für XAMPP unter Windows und MAMP unter MacOS.

pre-commit hook aktivieren

In jedem von Git verwalteten Projektordner gibt es einen Unterordner .git. Auf dem Mac sind Ordner mit Punkt am Anfang jedoch standardmäßig versteckt – durch Betätigen der Tastenkombination CMD + SHIFT + . (Punkt) kann die Anzeige der versteckten Dateien im Finder jedoch an- und auch wieder abgeschaltet werden. Innerhalb dieses Ordners gibt es einen Unterordner hooks, der – wie der Name vermuten lässt – die Dateien für die Erstellung von Git-Hooks beinhaltet.

Im diesem Ordner hooks gibt es eine Datei namens pre-commit.sample, welche zunächst in pre-commit umbenannt werden muss (.sample entfernen). Ist das erledigt, wird diese Datei, bzw. das darin enthaltene Shell-Skript beim nächsten Aufruf von git commit ausgeführt, und zwar vor dem eigentlichen Commit in das Git-Repository. Im nächsten Schritt muss also nun in diese Datei die Funktion zum Erstellen des Datenbank-Abbildes eingetragen werden (das vorhandene Beispiel-Skript in der Datei wird dabei überschrieben).

pre-commit hook für XAMPP unter Windows

#!/bin/bash
# Pre-commit hook to make a mysql dump right before committing and add it to the commit.
# The absolute path of mysqldump
MYSQLDUMP="C:\\xampp\\mysql\\bin\\mysqldump.exe"
# The name of a database user with read access to the database.
DBUSER="root"
# The password associated with the above user. Leave commented if none.
DBPASS=""
# The database associated with this repository.
DBNAME="YOUR-MYSQL-DATABASE-NAME"
# The path relative to the repository root in which to store the sql dump.
DBPATH="_mysql"
printf "Dumping database ...\n"
[[ -d $DBPATH ]] || mkdir $DBPATH
if [ -n "$DBPASS" ]; then
 $MYSQLDUMP -u $DBUSER -p$DBPASS $DBNAME > $DBPATH/$DBNAME.sql
else
 $MYSQLDUMP -u $DBUSER $DBNAME > $DBPATH/$DBNAME.sql
fi
printf "Adding database to repository...\n"
git add $DBPATH/$DBNAME.sql
exit 0

Im oben gezeigten Skript sind bereits die Standard-Zugangsdaten zur MySQL-Datenbank unter XAMPP auf Windows eingetragen (User: root, Pass: [leer]). Der Name der Datenbank („YOUR-MYSQL-DATABASE-NAME“ im obigen Skript) muss natürlich angepasst werden. Ebenso der Pfad zur mysqldump.exe, falls XAMPP an einem anderen Speicherort installiert wurde.

pre-commit hook für MAMP unter MacOS

#!/bin/bash
# Pre-commit hook to make a mysql dump right before committing and add it to the commit.
# NOTE: if hook not executed try the following command:
# chmod +x .git/hooks/pre-commit
# The absolute path of mysqldump
MYSQLDUMP="/Applications/MAMP/Library/bin/mysqldump"
# The name of a database user with read access to the database.
DBUSER="root"
# The password associated with the above user. Leave commented if none.
DBPASS="root"
# The database associated with this repository.
DBNAME="YOUR-MYSQL-DATABASE-NAME"
# The path relative to the repository root in which to store the sql dump.
DBPATH="_mysql"
printf "Dumping database ...\n"
[[ -d $DBPATH ]] || mkdir $DBPATH
if [ -n "$DBPASS" ]; then
 $MYSQLDUMP -u $DBUSER -p$DBPASS $DBNAME > $DBPATH/$DBNAME.sql
else
 $MYSQLDUMP -u $DBUSER $DBNAME > $DBPATH/$DBNAME.sql
fi
printf "Adding database to repository...\n"
git add $DBPATH/$DBNAME.sql
exit 0

Im oben gezeigten Skript sind bereits die Standard-Zugangsdaten zur MySQL-Datenbank unter MAMP auf MacOS eingetragen (User: root, Pass: root). Der Name der Datenbank („YOUR-MYSQL-DATABASE-NAME“ im obigen Skript) muss natürlich angepasst werden. Ebenso der Pfad mysqldump, falls MAMP an einem anderen Speicherort installiert wurde.

Und was macht das?

Der so eingerichtete pre-commit hook erstellt bei jedem Aufruf von git commit einen SQL-Dump, und legt diesen – benannt nach der Datenbank – im Ordner _mysql (der Ordner wird automatisch erstellt wenn er noch nicht vorhanden ist) auf der obersten Ebene des Projektordners ab, fügt das Abbild via git add dem Index hinzu und führt erst danach den eigentlichen Commit aus. Somit landet dieser Ordner samt darin enthaltenen SQL-Dump mit im aktuellen Git Commit. Muss man später auf einen älteren Stand zurücksetzen, hat man somit auch immer gleich das zum damaligen Zeitpunkt aktuelle Datenbank-Abbild zur Hand und kann dieses wieder Einspielen.

Das Zurückspielen des SQL-Dumps in die Datenbank ließe sich mit einem post-checkout-hook ebenfalls automatisieren – das ist jedoch nicht Bestandteil dieses Artikels.
Wer sich weiter in das Thema einlesen möchte, findet hier vielen Infos: https://git-scm.com/book/gr/v2/Customizing-Git-Git-Hooks

Credits

Die Basis für die oben gezeigten Skripte war ein Gist vom „nuclearsandwich“ sowie die Kommentare dazu.

Das Skript ist nach besten Wissen getestet und erfüllt in meinem Szenario die gewünschten Anforderungen. Dennoch erfolgt die Nutzung des auf eigene Gefahr!

Schreibe einen Kommentar

Personenbezogene Daten interessieren mich nicht – daher ist die Angabe von Name und E-Mail-Adresse freiwillig. Jedoch wird jeder Kommentar von mir geprüft, bevor er freigeschalten wird.