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

すぐにすべてを理解した人のために、ジェネレーターのソースを広げました: GenealogyTreeInGitと系統樹自体- 私と米国の大統領 。
さらに、単純なソーシャルグラフを実装しました。 血縁関係の度合いだけでなく、子孫間の関係の状態も表示され、結婚式、離婚、出産などのイベントや、一方または他方の関係への貢献が表示されます。
Git
幸いなことにまたは不幸なことに、Gitは勝者の状態にやや似ています。これにより、履歴、つまり日付、メッセージ、コミットの作成者を変更できます。 しかしそれどころか、特定の日に行われたイベントの作成者であるかのように、家族を追加できるという事実に貢献しています。
私は簡単なものから始めました:私はいくつかのコマンドと出来事を書きました-ツリーの断片は準備ができています。 素晴らしい。 今、私たちは親relativeの軍隊全体でこれを行う必要があります。 混乱する可能性のある200行のチームと、社長向けに、すべて10Kを喜んで書きます!
ばかリストに私を追加しましたか? 消します。 もちろん、プロセスを自動化し、系図データを一連のgitコマンドに変換するアプリケーションを作成しました。 そのようなデータにはいくつかの形式があり、 GEDCOMを選択しました。
ゲドコム
この不名誉をすべて.NET Coreに実装しました。これは便利でクロスプラットフォームです。 GeneGenie.Gedcom 、 gedcomx-csharpなど、GEDCOMを解析および処理するためのC#の下にいくつかのライブラリがあります。 GedcomParserに基づいて自分で書くことにしました 。 致命的な欠陥があるためです...実際、いいえ:形式をよりよく理解し、すべての依存関係を取り除きたいので、必要に応じてプロジェクトを他の言語に簡単に移植できます。
チーム生成
私たちにとって便利な形式で抽出されたパーソナリティをバイパスし、それらのGitコマンドを生成する時が来ました。 すべてのイベントを時系列順にソートし、ブランチを作成し、それらをマージしてコミットし、日付の昇順で移動することにしました。 残念ながら、すべてのイベントに日付があるわけではないので、すべてのイベントを正しく並べ替えるために多くの作業をしなければなりませんでした。 鼻の上で2 ^ 2 ^ 3、そして私はこのアプローチが完全に正しいわけではないことに気づきました。 後で修正します(ただし、これは正確ではありません)。
初期化
この段階で必要なことは、リポジトリを初期化することだけです。
mkdir Family cd Family git init
イベント
スクリプトのこの部分では、すべてのイベントがバイパスされ、コミットされます。 このために、次のコマンドが使用されました。
git checkout --orphan branch_name
git merge @I1@ --allow-unrelated-histories --no-commit
git commit -m "msg" --date "" --author "name <email>" --allow-empty
最初の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人)を作成しました。 それらは、それぞれKochurkinsとPresidentsのリポジトリで利用可能です。 自分で作成するために、 geni.comサービスを使用して、 そこからツリーをGEDCOMにエクスポートしました。 生成された系図リポジトリ作成スクリプトは、 Gistで利用可能です。

GitHubおよびGitLabでは、祖先と子孫をナビゲートできます。 これは、 FamilypediaまたはWeRelate系図wikiに似ています。 --clone
、git(x | l)は--clone
高度です。ツリーは( --clone
を使用して)簡単にポンピングされます。 そして最も重要なことは、グラフ全体をすぐに開くことができることです。 (何らかの理由で、既存の家系図プログラムは小さなグラフでさえも完全に開くことが困難でした。)さまざまなツール(Webサービス、 Git Extesions 、 Sourcetree 、 GitKrakenなど)を使用してこれを行うことができます。 さらに、これらのサービスは、ほとんどの系図サービスとは異なり、無料で使用できます。
git * abachでは、ある種の分析でも利用可能であることは注目に値します。 インスタグラムライフ 波乱に満ちた生活。 まあ、または最もオープンな:[ Insights
]タブには、コミットの降順でユーザーのリストが表示されます。

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

問題
物語をルーツで補う方法はあまり明確ではありません。 これまでのところ、GEDCOMファイルから完全に生成する必要があります。 私はこれがreなリベースの助けを借りてできることを除外しません-あなたは実験してコメントで伝えることができます。 また、「イベント指向」ではなく「コミット指向」で動作するようにコードを書き直すとよいでしょう。 これはgitaに関してより自然です。実際、その中のブランチはコミットのシーケンスであり、個別のエンティティではありません。 また、 タグとサブモジュールをバインドする方法についても考えましたが、今のところ、それをよりうまく行う方法を知っています。
おわりに
家系図の概念を開発者向けのWebサービスにまで拡張すると、 課題を使用して、さまざまなグローバルタスクを設定し、さまざまなマイルストーンに従ってそれらを配布できます:幼年期、青年期、成人期、老年期。
家系図に加えて、次のことができます 他のパンをトロリーバスに変える プログラミング言語の系図ツリー(これはさらに「エンコーダースタイル」です)、構文ツリー、および一般的に任意のツリー構造をエンコードします。 Gitは主婦によってマスターされ、ブラジルのテレビ番組のヒーロー同士の関係を構築できます。
実用的な利点:このウォームアップは、GEDCOMファミリツリーの記述形式だけでなく、geetの構造、そのコマンドをよりよく理解するのに役立ちます。
記事自体のソースコードはGitHubで入手できます。エラーを見つけたりコンテンツを追加したい場合は、そこにプルリクエストを送信してください。 habr.com形式に変換するには、MarkConvライブラリを使用します。