Stammbaum in git

Glücklicher Programmiertag! Ich wünsche Ihnen mehr helle Commits, zusammengeführte Pull-Anfragen, weniger Zusammenführungskonflikte und dass Ihre Lebenszweige so lange wie möglich relevant bleiben. Als konzeptionelles Geschenk schlage ich die Implementierung eines Stammbaums mittels des Git-Versionskontrollsystems vor. Nun ... klingt nach einem Plan!



Für diejenigen, die sofort alles verstanden haben, gebe ich Links zum Quellcode: GenealogyTreeInGit und Stammbäume: meine und US-Präsidenten .


Zusätzlich habe ich einen einfachen sozialen Graphen implementiert. Es zeigt nicht nur den Verwandtschaftsgrad, sondern auch den Status der Beziehungen zwischen Nachkommen, Ereignisse wie Hochzeit, Scheidung, Geburt sowie Beiträge zu den Beziehungen.


Git


Ich möchte Sie daran erinnern, dass Git eines der beliebtesten Versionskontrollsysteme ist. Es ist leistungsstark: Sie können Änderungen festschreiben, Zweige erstellen (auschecken) und zusammenführen, verschiedene Versionen von Dateien vergleichen (diff), Autoren bestimmter Zeichenfolgen identifizieren (Schuld) und viele andere Dinge tun.

Glücklicherweise oder unglücklicherweise ähnelt Git dem Gewinner, der den Verlauf neu schreibt: Sie können Daten, Nachrichten und Autoren von Commits ändern. Auf diese Weise können Sie jedoch Familienmitglieder hinzufügen, als wären sie die Autoren von Ereignissen, die an einem bestimmten Datum durchgeführt wurden.


Ich habe klein angefangen: Ich habe mehrere Befehle geschrieben und voila, ein Fragment des Baumes ist fertig. Gut Jetzt machen wir das mit der ganzen Armee von Verwandten. Gerne schreibe ich 200 Zeilen verwirrenden Codes für sie und 10.000 Zeilen für Präsidenten!


Hast du mich schon zur Liste der Idioten hinzugefügt? Schlag ab. Natürlich habe ich den Prozess automatisiert und eine Anwendung zum Konvertieren genealogischer Daten in eine Folge von Git-Befehlen geschrieben. Es gibt verschiedene Formate für solche Daten, ich habe GEDCOM gewählt .


Gedcom


GEDCOM ist eine Spezifikation für den Austausch genealogischer Daten. Dieses Format ist ziemlich alt, aber einfach. Die Spezifikation ist im Internet gut beschrieben . Es wird von fast allen genealogischen Programmen unterstützt, daher gibt es viele Beispiele dafür: US-Präsidenten, die königliche Dynastie, Shakespeare.

Ich habe all dieses Durcheinander in .NET Core implementiert - es ist praktisch und plattformübergreifend. Zum Parsen und Verarbeiten von GEDCOM gibt es mehrere C # -Bibliotheken, z. B. GeneGenie.Gedcom , gedcomx-csharp . Ich habe beschlossen, meine eigene Bibliothek auf der Basis von GedcomParser zu schreiben, da sie einen schwerwiegenden Fehler aufweist ... Nein, ich wollte nur das Format selbst verstehen und alle Abhängigkeiten beseitigen , die es mir ermöglichen würden, das Projekt bei Bedarf einfach zu portieren andere Sprachen.


Befehlsgenerierung


Es ist Zeit, die extrahierten Daten in einem praktischen Format zu verarbeiten und Git-Befehle dafür zu generieren. Ich habe beschlossen, alle Ereignisse in chronologischer Reihenfolge zu sortieren und dann Zweige zu erstellen, sie zusammenzuführen und in aufsteigender Reihenfolge der Daten festzuschreiben. Leider haben nicht alle Ereignisse Daten, so dass es nicht einfach war, alle Ereignisse richtig zu sortieren. 2 ^ 2 ^ 3 Tag kommt, und ich erkannte, dass dieser Ansatz nicht ganz richtig war, da die Tiefensuche viel einfacher wäre. Vielleicht werde ich es später korrigieren.


Initialisierung


In dieser Phase initialisieren wir nur das Repository:


mkdir Family cd Family git init 

Ereignisse


In diesem Teil des Skripts werden alle Ereignisse verarbeitet und festgeschrieben. Dazu wurden folgende Befehle verwendet:


  • git checkout --orphan branch_name
  • git merge @I1@ --allow-unrelated-histories --no-commit
  • git commit -m "msg" --date "" --author "name <email>" --allow-empty

Der erste Befehl, checkout , erstellt für jede Person einen Zweig. Mit --orphan Flag --orphan können Sie verwaiste Zweige erstellen, d. H. Zweige ohne Eltern. Der verwaiste Zweig wird einmal erstellt. Wenn Sie das nächste Mal mit dem Befehl checkout Zweigen wechseln, wird dieser Parameter weggelassen. Am Ende haben fast alle Commits Eltern, mit Ausnahme der entferntesten Vorfahren, da die früheren unbekannt sind.


Der zweite Befehl, merge , vereint die Eltern und erstellt das Kind. Wir schreiben "Geburt" mit dem entsprechenden Jahr in die Festschreibungsnachricht. Wir geben auch die Flags --allow-unrelated-histories und --no-commit an, um das Zusammenführen verwaister Zweige zu ermöglichen und Änderungen später --allow-unrelated-histories . Einige Kinder werden adoptiert, deshalb schreiben wir "Adoptiert" für sie. Witzig, aber Git erlaubt Gruppenehen, d. H. Es ist möglich, mehr als zwei Zweige gleichzeitig zusammenzuführen. Und die Zweige haben kein Geschlecht, so dass Sie sie "Eltern 1" und "Eltern 2" nennen können. Es ist übrigens auch möglich, Alleinerziehende zu gründen.


Schließlich erstellt der dritte Befehl, commit , ein neues Commit mit der Nachricht -m , dem Datum --date und dem Autor --author . Wie bereits erwähnt, können Sie mit Git die Nachricht, den Autor und das Datum des Commits ändern. Darüber hinaus können Sie mit Git Commits ohne Dateien mit dem Flag --allow-empty und ohne Nachrichten mit dem Flag --allow-empty-message . Der Autor muss auch eine E-Mail angeben, aber Git akzeptiert eine leere - Sie müssen nur <> schreiben. Leider respektiert Git ältere Menschen nicht: Die Untergrenze des Commit-Datums ist der 1. Januar 1970 (der "Beginn" der Unix-Zeit) - das frühere Datum wird falsch angezeigt. Sie können jedoch einfach das tatsächliche Datum in der Beschreibung angeben. Trotzdem akzeptiert Git Termine in der Zukunft - schau dir meinen Sohn Git an. Es ist übrigens auch möglich, Alleinerziehende zu gründen.


Soziale Grafik


In der sozialen Grafik werden neben der Geburt auch andere Ereignisse gespeichert: Taufe, Wohnortwechsel, Abschluss, Heirat, Scheidung, Tod, Beerdigung. Nach dem Tod Der Zweig geht in den digitalen Himmel Das Auftreten nachfolgender Ereignisse mit Ausnahme von Beerdigungen ist in der Branche nicht möglich. Auf dem Server können Sie diesen Zweig schützen (keine Sorge: Es ist möglich, ihn in Zukunft bei Bedarf wiederzubeleben).


Die Veranstaltung "Hochzeit" hat zwei Vorfahren - Ehepartner. "Scheidung" hat einen Vorfahren - die vorherige "Hochzeit". Familie und Elternschaft sind Arbeit, daher können wir sagen, dass nach der Hochzeit auch ein neuer Nachkomme auftaucht - "Beziehung", die nach einer Scheidung (oder dem Tod eines Ehepartners) endet. Es wird nach der nächsten Hochzeit fortgesetzt. Darüber hinaus können mehrere Personen an einer Beziehung teilnehmen (Zusammenführen mehrerer Zweige).


Finalisierung


Die Kirsche auf dem Kuchen: Wir erstellen ein Backup-Repository und laden alle Teilnehmer auf GitHub, GitLab oder einen anderen Server hoch, der Git unterstützt. Wir können die Zweige einzeln verschieben, aber mit dem magischen Befehl werden wir sie alle verschieben, was viel schneller und einfacher ist:


 git remote add origin https://gitlab.com/KvanTTT/Family.git git push origin --all -u 

Um einen gemeinsamen Stammbaum zu generieren, müssen Sie beim Starten des Generators das Flag - --only-birth-events . In diesem Fall wird ein Commit pro Person (Geburt) erstellt. Ansonsten a soziales Netzwerk Ein sozialer Graph wird generiert.


Beispiele


Als kleines Beispiel, das zumindest überall funktionieren wird, habe ich meinen Stammbaum erstellt, und ein großes Beispiel ist der Baum der US-Präsidenten (2145 Personen). Sie sind in den Repositories von Kochurkins bzw. Presidents verfügbar. Um meinen eigenen Baum zu erstellen, habe ich den Dienst geni.com verwendet , von dem ich den Baum nach GEDCOM exportiert habe. Ein generiertes Skript zum Erstellen eines genealogischen Repositorys ist in Gist verfügbar.



Auf GitHub (und auch auf GitLab) können Sie durch Vorfahren und Nachkommen navigieren. Dies ähnelt den genealogischen Wiki-Systemen Familypedia oder WeRelate . GitHub / GitLab ist jedoch weiter fortgeschritten: Die Bäume können einfach heruntergeladen werden (mithilfe des Befehls --clone ). Und vor allem können Sie das gesamte Diagramm auf einmal öffnen. (In vorhandenen genealogischen Programmen gibt es aus irgendeinem Grund Schwierigkeiten, auch kleine Diagramme zu öffnen.) Dies können Sie mit verschiedenen Tools (Webdienst, Git-Erweiterungen , Sourcetree , GitKraken und andere) tun . Darüber hinaus können diese Dienste im Gegensatz zu den meisten genealogischen Diensten kostenlos genutzt werden.


Es ist bemerkenswert, dass auf GitHub / GitLab sogar eine Art von Analyse verfügbar ist: Sie können herausfinden, wer am meisten hat folgte Instagram Account ereignisreiches Leben. Oder die öffentlichste: Auf der Registerkarte " Insights wird eine Liste der Personen in der Reihenfolge der abnehmenden Anzahl von Commits angezeigt.



Leider zeigen GitHub und GitLab große Bäume nicht richtig an, aber sie werden richtig gespeichert - Sie können das Repository öffnen und überprüfen. Hier ist mein Baum in der GitLab-Weboberfläche:



Probleme


Es ist nicht sehr klar, wie man die Geschichte von Grund auf ergänzt. Vorerst müssen Sie es von Anfang an aus der GEDCOM-Datei generieren. Wahrscheinlich kann dies mit Hilfe von rebase - Sie können versuchen, es in den Kommentaren zu sagen. Es wäre auch besser, den Code neu zu schreiben, um ihn "festschreibungsorientiert" und nicht "ereignisorientiert" zu machen, da er eher Git-ähnlich ist: Tatsächlich ist der Zweig eine Folge von Festschreibungen, keine separate Entität. Ich habe auch darüber nachgedacht, Tags und Submodule zu implementieren, aber im Moment weiß ich nicht, wie ich es besser machen soll.


Fazit


Wenn Sie die Idee von Stammbäumen weiter auf Webdienste für Entwickler ausweiten, können Sie mithilfe von Problemen globale Aufgaben erstellen und diese nach Meilensteinen verteilen: Kindheit, Jugend, Erwachsenenalter, Alter.


Neben Stammbäumen können Sie Git verwenden, um genealogische Bäume von Programmiersprachen (dies ist noch geekiger), Syntaxbäume und beliebige Baumstrukturen zu codieren. Git kann auch für Hausfrauen nützlich sein, um Beziehungen zwischen den Charakteren brasilianischer Seifenopern aufzubauen :)


Praktischer Vorteil: Dieses Aufwärmen hilft, die Struktur von Git, seine Befehle und das GEDCOM-Format zur Beschreibung genealogischer Daten besser zu verstehen.


Die Quellen des Artikels sind auf GitHub verfügbar. Bitte senden Sie eine Pull-Anfrage, wenn Sie einen Fehler finden oder etwas hinzufügen möchten. Für die Konvertierung in das habr.com-Format verwende ich die Bibliothek MarkConv .

Source: https://habr.com/ru/post/de465959/


All Articles