Git内の家系図

プログラマの日おめでとうございます! より明るい「コミット」、受け入れられた「プルリクエスト」、計画外の「マージ」が少なくなり、あなたの人生の枝ができるだけ長く関連することを願っています。 アイデアの贈り物として、Gitバージョン管理システムを使用した家系図の実装を提案します。 まあ...それは計画のように聞こえます!







コチュルキンス







すぐにすべてを理解した人のために、ジェネレーターのソースを広げました: GenealogyTreeInGitと系統樹自体- 米国の大統領







さらに、単純なソーシャルグラフを実装しました。 血縁関係の度合いだけでなく、子孫間の関係の状態も表示され、結婚式、離婚、出産などのイベントや、一方または他方の関係への貢献が表示されます。







Git



Gitは最も一般的なバージョン管理システムの1つであることを思い出させてください。 強力です:変更のコミット(コミット)、ブランチの作成とマージ(チェックアウトとマージ)、異なるバージョンのファイルの比較(diff)、特定の行の作者の計算(非難)、その他多くのことを行うことができます。


幸いなことにまたは不幸なことに、Gitは勝者の状態にやや似ています。これにより、履歴、つまり日付、メッセージ、コミットの作成者を変更できます。 しかしそれどころか、特定の日に行われたイベントの作成者であるかのように、家族を追加できるという事実に貢献しています。







私は簡単なものから始めました:私はいくつかのコマンドと出来事を書きました-ツリーの断片は準備ができています。 素晴らしい。 今、私たちは親relativeの軍隊全体でこれを行う必要があります。 混乱する可能性のある200行のチームと、社長向けに、すべて10Kを喜んで書きます!









ばかリストに私を追加しましたか? 消します。 もちろん、プロセスを自動化し、系図データを一連のgitコマンドに変換するアプリケーションを作成しました。 そのようなデータにはいくつかの形式があり、 GEDCOMを選択しました。







ゲドコム



GEDCOM-家系図の記述形式。 かなり古いが、テキストであり、一般的にシンプル。 形式の仕様は、インターネットで詳しく説明されています。 ほとんどすべての家系図プログラムによってサポートされているため、 多くの例があります。米国大統領の木、王朝、シェークスピアです。


この不名誉をすべて.NET Coreに実装しました。これは便利でクロスプラットフォームです。 GeneGenie.Gedcomgedcomx-csharpなど、GEDCOMを解析および処理するためのC#の下にいくつかのライブラリがあります。 GedcomParserに基づいて自分で書くことにしました致命的な欠陥があるためです...実際、いいえ:形式をよりよく理解し、すべての依存関係を取り除きたいので、必要に応じてプロジェクトを他の言語に簡単に移植できます。







チーム生成



私たちにとって便利な形式で抽出されたパーソナリティをバイパスし、それらのGitコマンドを生成する時が来ました。 すべてのイベントを時系列順にソートし、ブランチを作成し、それらをマージしてコミットし、日付の昇順で移動することにしました。 残念ながら、すべてのイベントに日付があるわけではないので、すべてのイベントを正しく並べ替えるために多くの作業をしなければなりませんでした。 鼻の上で2 ^ 2 ^ 3、そして私はこのアプローチが完全に正しいわけではないことに気づきました。 後で修正します(ただし、これは正確ではありません)。







初期化



この段階で必要なことは、リポジトリを初期化することだけです。







mkdir Family cd Family git init
      
      





イベント



スクリプトのこの部分では、すべてのイベントがバイパスされ、コミットされます。 このために、次のコマンドが使用されました。









最初のcheckout



、個人ごとにブランチを作成します。 --orphan



フラグを使用すると、孤立したブランチを作成できます。 親のない枝。 孤立ブランチは一度作成されます-次回checkout



を切り替えるときcheckout



このパラメーターは省略されます。 最終的に、最も遠い祖先を除いて、ほとんどすべてのコミットには親がいます。以前の祖先は未知であるためです。







2番目のチームmerge



、親を結合し、子を作成します。 私たちは、コミット誕生のメッセージに書き込みます-対応する年と誕生。 また、孤立したブランチをマージし、後で変更をコミット--no-commit



ために、フラグ--allow-unrelated-histories



および--no-commit



を指定します。 一部の子供は養子であるため、Adoptedを作成します。 おもしろいですが、Gitを使用するとスウェーデン語のファミリーを作成できます。 同時に複数のブランチを保持します。 また、枝にはセックスがありません。これは、「親1」と「親2」の愛好家にアピールします。







最後に、3番目のコマンドcommit



は、 -m



メッセージ、日付--date



および作成者--author



ます。 すでに書かれているように、Gitではメッセージ、作成者、コミットの日付を置き換えることができます。 さらに、Gitでは--allow-empty



フラグを使用してファイルなしでコミットを作成でき、 --allow-empty



--allow-empty-message



を使用してメッセージなしでコミットを作成できます。 作成者は電子メールも指定する必要がありますが、Gitは空の電子メールを受け入れます。 <>



を渡すだけです。 残念ながら、Gitは高齢者を尊重していません。何らかの理由で、コミットの日付が1970年1月1日以下に制限されています。以前の日付は正しく表示されません。 ただし、すべてがそれほど怖いわけではありません。説明に実際の日付を書くことができます。 ただし、Gitは将来を信じており、将来の日付を受け入れます。息子のGitに注意してください。 ところで、シングルマザーとシングルファーザーも作成できます。







ソーシャルグラフ



出生以外の出来事がソーシャルグラフに記録されます:洗礼、居住地の変更、教育、結婚、離婚、死、葬儀。 死後 ブランチはデジタルパラダイスに行く 葬儀を除いて、ブランチ内の後続イベントの出現は不可能です。 サーバー上では、そのようなブランチは一般に封印、つまり保護されたブランチにすることができます(心配しないでください:将来、必要に応じて「復活」することが可能になります)。







イベント「結婚式」には2つの祖先-配偶者がいます。 「離婚」には1つの祖先があります-前のイベント「結婚式」。 私たちは子供と同じように家庭生活に取り組む必要があります。そのため、結婚式の後、新しい子孫、つまり離婚後に終わる「関係」もあると言えます。 さて、彼らは次の結婚式離婚サイクルの後に再び再開します。 さらに、数人が関係に参加できます(複数のブランチをマージします)。







ファイナライズ



チェリーをケーキに追加します。リポジトリのバックアップを作成し、すべてのユーザーをGitHub、GitLab、またはGitをサポートする他のサーバーにアップロードします。 すべてのブランチを次々にプッシュできますが、 魔法のコマンドを使用して、すべて実行します。







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





通常の家系図を生成するには、ジェネレーターの起動時に--only-birth-events



フラグを渡す必要があります。 この場合、1人(誕生)ごとに1つのコミットが作成されます。 それ以外の場合は生成されます ソーシャルネットワーク ソーシャルグラフ。









少なくともどこでも開く小さな例として、私は家系図を作成し、大きな例として米国大統領の木(2145人)を作成しました。 それらは、それぞれKochurkinsPresidentsのリポジトリで利用可能です。 自分で作成するために、 geni.comサービスを使用して、 そこからツリーをGEDCOMにエクスポートしました。 生成された系図リポジトリ作成スクリプトは、 Gistで利用可能です。







社長







GitHubおよびGitLabでは、祖先と子孫をナビゲートできます。 これは、 FamilypediaまたはWeRelate系図wikiに似ています。 --clone



、git(x | l)は--clone



高度です。ツリーは( --clone



を使用して)簡単にポンピングされます。 そして最も重要なことは、グラフ全体をすぐに開くことができることです。 (何らかの理由で、既存の家系図プログラムは小さなグラフでさえも完全に開くことが困難でした。)さまざまなツール(Webサービス、 Git ExtesionsSourcetreeGitKrakenなど)を使用してこれを行うことができます。 さらに、これらのサービスは、ほとんどの系図サービスとは異なり、無料で使用できます。







git * abachでは、ある種の分析でも利用可能であることは注目に値します。 インスタグラムライフ 波乱に満ちた生活。 まあ、または最もオープンな:[ Insights



]タブには、コミットの降順でユーザーのリストが表示されます。







パルス







残念ながら、大きなツリーのGitHubとGitLabは正しく表示されませんが、それらは正しく保存されています-リポジトリを強化してこれを確認できます。 Hitlab Webインターフェースでは、私のツリーは次のようになります。







コチュルキンスGitlab







問題



物語をルーツで補う方法はあまり明確ではありません。 これまでのところ、GEDCOMファイルから完全に生成する必要があります。 私はこれがreなリベースの助けを借りてできることを除外しません-あなたは実験してコメントで伝えることができます。 また、「イベント指向」ではなく「コミット指向」で動作するようにコードを書き直すとよいでしょう。 これはgitaに関してより自然です。実際、その中のブランチはコミットのシーケンスであり、個別のエンティティではありません。 また、 タグサブモジュールをバインドする方法についても考えましたが、今のところ、それをよりうまく行う方法を知っています。







おわりに



家系図の概念を開発者向けのWebサービスにまで拡張すると、 課題を使用して、さまざまなグローバルタスクを設定し、さまざまなマイルストーンに従ってそれらを配布できます:幼年期、青年期、成人期、老年期。







家系図に加えて、次のことができます 他のパンをトロリーバスに変える プログラミング言語の系図ツリー(これはさらに「エンコーダースタイル」です)、構文ツリー、および一般的に任意のツリー構造をエンコードします。 Gitは主婦によってマスターされ、ブラジルのテレビ番組のヒーロー同士の関係を構築できます。







実用的な利点:このウォームアップは、GEDCOMファミリツリーの記述形式だけでなく、geetの構造、そのコマンドをよりよく理解するのに役立ちます。







記事自体のソースコードはGitHub入手できます。エラーを見つけたりコンテンツを追加したい場合は、そこにプルリクエストを送信してください。 habr.com形式に変換するには、MarkConvライブラリを使用します。








All Articles