57 Stimmen

Git mit großen Dateien

Situation

Ich habe zwei Server, Produktion und Entwicklung. Auf dem Produktionsserver gibt es zwei Anwendungen und mehrere (6) Datenbanken (MySQL), die ich Entwicklern zum Testen zur Verfügung stellen muss. Alle Quellcodes sind auf GitLab auf dem Entwicklungsserver gespeichert, und die Entwickler arbeiten nur mit diesem Server und haben keinen Zugriff auf den Produktionsserver. Wenn wir eine Anwendung veröffentlichen, meldet sich der Master auf der Produktionsseite an und zieht die neue Version von Git. Die Datenbanken sind groß (jeweils über 500M und zählend) und ich muss sie so einfach wie möglich an Entwickler für Tests verteilen.

Mögliche Lösungen

  • Nach einem Sicherungsskript, das Datenbanken dumppt, jeder in eine einzelne Datei, führen Sie ein Skript aus, das jede Datenbank in ihren eigenen Zweig schiebt. Ein Entwickler zieht einen dieser Zweige, wenn er seine lokale Kopie aktualisieren möchte.

    Diese Lösung funktionierte nicht.

  • Cron auf dem Produktionsserver speichert täglich Binärprotokolle und schiebt sie in den Zweig dieser Datenbank. Auf diese Weise gibt es im Zweig Dateien mit täglichen Änderungen, und der Entwickler zieht die Dateien, die er nicht hat. Der aktuelle SQL-Dump wird auf andere Weise an den Entwickler gesendet. Und wenn die Größe des Repositories zu groß wird, senden wir einen vollständigen Dump an die Entwickler und löschen alle Daten im Repository und starten von vorne.

Fragen

  • Ist die Lösung möglich?
  • Wenn git in das Repository pusht/pullt, lädt es dann ganze Dateien hoch/runter oder nur Änderungen darin (d.h. fügt neue Zeilen hinzu oder bearbeitet die aktuellen)?
  • Kann Git mit so großen Dateien umgehen? Nein.
  • Wie kann man festlegen, wie viele Revisionen in einem Repository aufbewahrt werden? Mit der neuen Lösung spielt das keine Rolle.
  • Gibt es eine bessere Lösung? Ich möchte die Entwickler nicht zwingen, solch große Dateien über FTP oder ähnliches herunterzuladen.

0voto

R. Liu Punkte 183

Wie in vielen anderen Antworten erwähnt, wird das Speichern großer Dateien in Git dringend nicht empfohlen. Ich werde nicht weiter darauf eingehen.

Ihre Frage scheint eher eine Frage zur Datenbankspeicherung als zu Git zu sein. Wenn die Datenbankinformationen nicht so umfangreich sind, dann

  1. Für Java können Sie flywaydb(java) verwenden, um die Differenz der Datenbank zwischen jedem Release zu speichern.
  2. Für Django kann es die db-Informationen in einem JSON-Dump speichern (python manage.py dumpdata your_app > datadump.json) und an anderer Stelle neu laden (python manage.py loaddata datadump.json)

Da Ihre Datenbank jedoch groß ist, sollten Sie beliebte binäre Speicher wie nexus oder artifactory in Betracht ziehen, die binäre Dateien speichern können oder als Speicher für gitlfs verwendet werden. Um jedoch die Belastung der Entwickler zu verringern, damit sie die Datei nicht explizit herunterladen müssen, müssen Sie Ihre eigene CI/CD-Pipeline erstellen, die es den Entwicklern ermöglicht, sie mit einem Klick zu veröffentlichen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X