Was ist die beste Vorgehensweise, um den Drupal-Kern zu aktualisieren, ohne das Git-Repo und die Produktions-Website zu beschädigen?


13

Ich habe ein Git-Repository, in dem sich mein gesamter Code im Hauptzweig befindet, und ich habe zuvor nur alle Drupal-Dateien ignoriert, sodass ich streng zwischen dem von mir geschriebenen (oder geänderten oder möglicherweise geänderten) Code und dem Code unterschieden habe das könnte mit Drush oder was auch immer erzeugt werden.

Dies schien eine gute Strategie zu sein, bis ich Drupal aktualisieren musste. Mir wurde klar, dass ich in der Lage sein möchte, ein Rollback durchzuführen, wenn die Dinge schlecht liefen, und welches bessere Tool zu verwenden ist als Git, um dies zu tun. Ich dachte mir, dies wäre die perfekte Situation für einen Feature-Zweig, also habe ich einen drupal-7.14Zweig erstellt, der es .gitignoremir erlaubt, alle meine Code- und Einstellungsdateien zu ignorieren und nur auf Dateien zu achten, die Teil der Drupal-Installation sind, die ich nicht möchte. ' nicht berühren. Ich habe ein manuelles Upgrade durchgeführt (Herunterladen, Entpacken, Entpacken, Kopieren), Grenzfälle wie robots.txt und .htaccess durchgesehen und den .gitignore von Drupal mit meinem eigenen überschrieben. Ich habe einige Einstellungen korrigiert, die mit 7.14, aber nicht mit 7.15 funktionierten, um einen 500-Fehler zu beheben, und dann schien alles perfekt zu sein. Ich benannte die Niederlassung in um drupal-7.15und wollte mich glücklich auf den Weg machen.

Bis ich merkte, was ich versehentlich getan hatte: Dateien, die zuvor von meinem Hauptzweig nicht verfolgt wurden, aber im Arbeitsverzeichnis verblieben waren, wurden jetzt aus dem Arbeitsverzeichnis entfernt, als ich master auscheckte, da es sich nicht mehr um nicht verfolgte Dateien handelte! D'oh!

Wenn ich die drupal-7.15Verzweigung mit master zusammenführe, geht die Codetrennung verloren.

Es gibt wahrscheinlich eine Möglichkeit, einen Zweig in ein Submodul umzuwandeln. Vorausgesetzt, dies ist möglich, ist dies möglicherweise die beste Strategie. Ich wusste, bevor ich das tat, dass Submodule die "richtige" Lösung waren, aber da ich den Nebeneffekt der Verwendung von Zweigen für zuvor nicht verfolgte Dateien nicht erkannte, entschied ich mich, Ecken zu schneiden und diesen Weg zu gehen. (Alle Ansätze, die ich bei der Verwendung von Submodulen mit Drupal gesehen habe, setzen voraus, dass Sie ein neues Projekt starten und Drupal der Hauptzweig ist. Es ist für mich unerwünscht, den Code eines anderen zum Hauptzweig zu machen, und das hatte ich bereits ein Repo mit einem Master-Zweig. Es sah so aus, als wäre es unnötig kompliziert, nur ein Upgrade durchzuführen.)

Möglicherweise gibt es eine andere Lösung, an die ich nicht gedacht habe.

Wie kann ich mich mit den geringstmöglichen Nachteilen am besten davon erholen?

AKTUALISIEREN : Dies befindet sich in der Entwicklung (in einer Linux-VM auf meinem Laptop) und ist noch nicht in Produktion gegangen. Bis wir zur Produktion gehen, habe ich vor, alles in Feature-Modulen zu verpacken, aber das ist noch nicht alles.

UPDATE 2 : Submodulefunktionieren möglicherweise nicht. Laut Pro Git können Sie mit "Submodulen ein Git-Repository als Unterverzeichnis eines anderen Git-Repositorys speichern". Drupal bietet keine so schöne Trennung. Anstatt dass sich der gesamte Drupal-Code in einem Unterverzeichnis befindet, ist die Beziehung mehr oder weniger invertiert, aber es gibt immer noch keine saubere Trennung, da Sie möglicherweise Ihre .htaccess- und robots.txt-Datei bearbeiten, sodass Ihr Code und das Drupal-Repo miteinander vermischt werden. Ich suche nach einer Lösung für dieses Problem .


Deine Frage dreht sich wirklich um git. Ich denke, Sie erhalten bessere Antworten, wenn Sie diese auf eine Site migrieren, die nicht Drupal-spezifisch ist. Über Upgrades: Ich aktualisiere immer, indem ich die make-Datei in einem neuen Verzeichnis erstelle und dann den Symlink von einem alten auf ein neues öffentliches Verzeichnis aktualisiere, wodurch Code-Rollbacks trivial werden.
Letharion

2
@ Letharion Ich bin anderer Meinung. Jeder Benutzer führt diesen Vorgang durch, um seine Website von der aktuellen Version auf eine neue zu aktualisieren. Die Verwendung von git zum Aktualisieren von Core ist ziemlich verbreitet, da dies eine weit verbreitete Methode zum Aktualisieren von Modulen ist. Viele Leute werden mit diesem Problem zu kämpfen haben, wie ich es zuvor hatte. Es gibt derzeit keine gute Dokumentation im Internet, die dieses Problem behebt, und ich glaube, dies ist ein guter Ort dafür.
iStryker

Nur zur Klarstellung, ich denke, eine Frage zu "Best Practice für das Upgrade von Drupal" wäre dann besser geeignet, da diese Frage wirklich "Wie repariere ich einen Git-Fehler" ist, von dem ich glaube, dass sie nicht hierher gehört. Habe aber keine starken Gefühle zu dem Thema, also lasse ich es dabei. :)
Letharion

OK Fair genug. Das Problem, das Brandon hat, ist ziemlich häufig. Vielleicht sollte ich eine neue Frage erstellen oder diese umschreiben (und den Rest auf eine andere Frage verschieben). Die ersten 2-3 Absätze sind üblich. Sie erstellen ein Git-Repo von 7.x-1.0 und möchten ein Upgrade auf 7.x-1.1 durchführen. Die Problemdateien sind .gitignore, .htaccess und robot.txt. Manchmal möchten Sie, dass sie verfolgt werden, weil sie modifiziert sind, manchmal möchten Sie nicht, dass sie verfolgt werden, weil sie modifiziert sind. Erstellen Sie beim Upgrade des Repos einen neuen Zweig, den Merge oder aktualisieren Sie einfach den Master. @ Letharion Vorschlag?
iStryker,

@Letharion: Ich dachte darüber nach, ob ich das auf StackOverflow als Git-Frage oder hier als Drupal-Frage setzen soll. Wenn ich es dort hin bringe, würde sich jeder beschweren und sagen, dass es wirklich um Drupal geht, und ich denke, dass sie wirklich Recht haben würden. Auch wenn Git das Werkzeug ist, mit dem die Situation repariert werden kann, hängt die eingeschlagene Richtung von Drupal-Kenntnissen ab. Jeder Drupal-Benutzer verwendet Git (oder sollte dies nicht tun), aber nur ein kleiner Teil der Git-Benutzer verwendet Drupal. Leute, die Fragen zu Git beantworten, werden den Drupal-Hintergrund nicht verstehen.
Iconoclast

Antworten:


10

Aus der obigen Diskussion geht es bei Ihrer Frage nicht darum, Ihr Git-Repo zu reparieren, sondern darum, eine Drupal-Site in Git zu pflegen und wie dies mit Kernupdates funktioniert.

Ich denke, dass die Standardpraxis darin besteht, alle Dateien in Ihrem Repository zu behalten, einschließlich des Drupal-Kerns. Die Trennung von Drupal-Code von benutzerdefiniertem Code scheint eine nette Idee zu sein, aber ich denke nicht, dass dies notwendig ist, und ich sehe keine Vorteile, die sich daraus ergeben. Es scheint auch davon auszugehen, dass Sie den Core niemals patchen möchten (oder dies als Teil Ihrer Bereitstellung tun müssen). Dies ist zwar keine bewährte Methode, aber auf jeden Fall etwas, das Sie tun möchten, wenn etwas kaputt geht in Produktion. Halten Sie Ihre Commits nett und konzentriert, um diese Art der Trennung zu erreichen.

Die Lösung, die ich verwendet habe, besteht darin, den gesamten Code im selben Repository zu belassen, so viel wie möglich in Features oder andere Arten von Exporten / Code / Konfigurationen zu speichern und eine Liste der Patches zu erstellen, die auf Out-of-the-Server angewendet werden müssen -Box Kern und Beitr.

Wenn Sie den Core aktualisieren, starten Sie in Ihrer Entwicklungsumgebung:

  • Stellen Sie sicher, dass das Arbeitsverzeichnis sauber ist
  • Neueste Datenbank sichern (drush sql-dump ). Machen Sie entweder ein Commit mit dem Dump oder speichern Sie es an einem sicheren Ort.
  • Kern aktualisieren (drush up drupal )
  • Übernehmen Sie alle Änderungen.
  • Überprüfen Sie die Patch-Datei. Wenn Patches angewendet werden müssen, wenden Sie diese an und führen Sie ein weiteres Commit durch
  • Führen Sie bei Bedarf update.php aus (bereits erledigt, wenn Sie drush für das Update verwendet haben)
  • Testen Sie Ihre Entwickler-Site. Wenn alles in Ordnung ist, senden Sie den Code an die Produktion. Laufdrush updbAuf Produktion .
  • Wenn es ein Problem gibt und Sie zurücksetzen müssen, setzen Sie entweder Ihr Repo zurück oder setzen Sie es zurück ( git reset --hard HEAD~2sollte es tun), oder setzen Sie die beiden Commits zurück, wenn Sie den Verlauf beibehalten möchten. Ersetzen Sie Ihre Datenbank durch den Speicherauszug.

Der Datenbankspeicherauszug ist erforderlich, da Sie ansonsten Änderungen, die durch Aktualisierungen an der Datenbank vorgenommen wurden, nicht rückgängig machen können. Sie können die Aktualisierung auch in einem Zweig vornehmen. In diesem Fall bedeutet das Zurücksetzen nur das Auschecken des Masters. Es ist nicht ratsam, wenn Sie an einer Entwickler-Site arbeiten, da Sie aufgrund der Datenbank nicht wirklich zum Master zurückkehren und dort parallel weiterarbeiten können.

Wenn Sie diesen einfacheren git-seitigen Workflow verwenden, können Sie die volle Leistung von git nutzen, wenn Sie sie benötigen, ohne dass Submodule usw. erforderlich sind.


0

Aus meinen obigen Kommentaren geht es bei dieser Frage darum , wie Drupal-Site- Dateien mit git verwaltet werden und wie dies mit Kernaktualisierungen funktioniert. Sie haben nichts über das Sichern und Aktualisieren der Datenbank erwähnt. Ich werde versuchen, nichts von goron answer zu kopieren.

Ich habe einen Blogeintrag zu diesem Problem erstellt. Aktualisieren des Drupal-Kerns auf Ihrer Website mit Git

Alternative Methoden

  1. Führen Sie den Drush-Befehl aus drush up drupal
  2. Wenden Sie einen Patch der Unterschiede zwischen den Versionen an. Siehe http://drupal.org/node/359234 & http://fuerstnet.de/en/drupal-upgrade-easier

Sie haben dies nicht angegeben, aber wenn Sie daran interessiert sind, die Änderungen zwischen Drupal-Versionen zu verfolgen, würde ich dies tun, indem Sie Tags anstelle von Verzweigungen verwenden . Wenn Sie mit Ihrem Upgrade-Commit zum Master fertig sind, kennzeichnen Sie Ihren Code als 7.x.


Wenn ich das richtig verstehe, schlagen Sie auch vor, den gesamten Drupal-Kerncode im selben Repository zu speichern. Dies scheint der Konsens zu sein. Ich zögere, aber ich muss vielleicht nachgeben und es so machen.
Iconoclast

Ja, alles in einem Repository. Ich habe Module, Profile und Themes im Core / Main-Repository, die ihre eigenen Git-Repos sind. Ich weiß nicht, ob es der beste Weg ist, aber es ist der beste Weg, den ich kenne.
iStryker

Diese Lösung bietet keinen Weg zurück. mein grund zur abstimmung.
Andre Baumeier

@Serpiente: Ich verstehe nicht, warum das Fehlen eines Rückwegs ein Grund für eine Ablehnung sein sollte. Wenn es der beste Ansatz ist, ist das genug. Wenn Sie nicht der Meinung sind, dass dies der beste Ansatz ist, geben Sie bitte an, warum nicht.
Bilderstürmer

@iconoclast Was ist mit einem Revisionssystem, wenn Sie nicht in Ihre Zeitleiste zurückkehren können? Denken Sie beispielsweise an ein fehlgeschlagenes Update. Wie können Sie es hier wiederherstellen? Eine ausgelieferte Version von "welcher" Software sollte eindeutige Abhängigkeiten aufweisen, dazu gehört insbesondere der Framework-Kern. Andernfalls können Sie Ihren Git einfach löschen und die FTP-Rollouts erneut ausführen. Nur meine 2 Cent.
Andre Baumeier

0

Ich führe das Setup mit zwei Zweigen aus, genau wie das OP: einem Zweig mit nur meinem benutzerdefinierten Code und einem Zweig, der sowohl meine benutzerdefinierten als auch meine Kerndateien enthält. Ich bin auf dieselbe Situation gestoßen: Die ignorierten Kerndateien werden beim Wechseln zwischen Zweigen entfernt.

Am Ende hatte ich zwei identische Git-Verzeichnisse: - eines zum Bearbeiten meines benutzerdefinierten Codes mit den vorhandenen, aber ignorierten Kerndateien, und ich würde niemals zum "vollständigen" Zweig in diesem Verzeichnis wechseln - eines zum Durchführen von Zusammenführungen, so dass ich würde Führen Sie das Umschalten und Zusammenführen der Zweige nur in diesem Verzeichnis durch.

Der Grund, warum ich mich für dieses Setup mit zwei Zweigen entscheide, ist, dass ich alle lokalen Festschreibungen für Core-Dateien auf einfache Weise verfolgen möchte. Es ist einfacher, Core-Mods beim Upgrade von Core-Dateien zu überprüfen und erneut anzuwenden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.