程序员节快乐! 希望您提交的内容更加聪明,合并的合并请求,合并的冲突更少,并且您的生命分支尽可能长地保持相关性。 作为概念上的礼物,我建议通过Git版本控制系统实现家谱。 好吧...听起来像是一个计划!
对于那些立即了解了一切的人,我提供了源代码链接: GenealogyTreeInGit和家谱 : 我的和美国总统 。
另外,我实现了一个简单的社交图 。 它不仅显示亲戚关系,而且还显示后代之间的关系状态,诸如婚礼,离婚,分娩之类的事件以及对关系的贡献。
吉特
幸运的是,Git与重写历史的获胜者相似:它允许您更改日期,消息和提交的作者。 但是,这使您可以添加家庭成员,就像他们是特定日期进行的事件的作者一样。
我从小开始:我写了几个命令,瞧,树的片段已经准备好了。 好啊 现在,我们将与整个亲属部队一起这样做。 我很乐意为他们写200行混乱的代码,为总统写1万行!
您已经将我添加到白痴列表中了吗? 罢工 当然,我使过程自动化,并编写了将谱系数据转换为Git命令序列的应用程序。 这些数据有几种格式,我选择了GEDCOM 。
捷通
我在.NET Core中实现了所有这些混乱,它很方便且跨平台。 为了解析和处理GEDCOM,有几个C#库,例如GeneGenie.Gedcom , gedcomx-csharp 。 我决定基于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
命令切换分支时,将忽略此参数。 最后,除最远的祖先外,几乎所有的犯人都有父母,因为较早的祖先是未知的。
第二个命令merge
, merge
父母并创建孩子。 我们在提交消息中写上带有相应年份的“出生”。 我们还指定了标志--allow-unrelated-histories
和--no-commit
以启用合并孤立分支并在以后提交更改。 一些孩子被收养,因此我们为他们写“收养”。 很有趣,但是Git允许组婚,即一次可以合并两个以上的分支。 而且分支没有性别,因此您可以将它们称为“父1”和“父2”。 顺便说一句,也可以创建单亲。
最后,第三个命令commit
会创建一个新提交,其中包含消息-m
,date --date
和author --date
。 正如我已经提到的,Git允许您更改消息,作者和提交日期。 而且,Git允许您创建带有标志--allow-empty
没有文件的提交,也没有带有标志--allow-empty-message
提交。 作者还需要指定一封电子邮件,但是Git接受一个空的电子邮件-您只需要编写<>
。 不幸的是,Git不尊重老年人:提交日期的下限是1970年1月1日(Unix时间的“开始”),而较早的日期将被错误地显示。 但是,您只需在说明中提及真实日期即可。 不过,Git会接受将来的日期-看看我的儿子Git。 顺便说一句,也可以创建单亲。
社会图
在社交图中,还存储了除出生以外的其他事件:洗礼,住所变更,毕业,婚姻,离婚,死亡,葬礼。 死后 分支进入数字天堂 除葬礼外,随后的事件在分支中是不可能出现的。 在服务器上,可以将此分支设置为受保护的 (不必担心:将来可以在必要时“恢复”它)。
事件“婚礼”有两个祖先-配偶。 “离婚”有一个祖先-以前的“婚礼”。 家庭和养育子女是工作,所以我们可以说,在婚礼之后,还会出现一个新的后代-“关系”,在离婚(或配偶死亡)后终止。 在下一次婚礼后恢复。 另外,几个人可能会参加一个关系(合并多个分支)。
定案
可喜的是:我们建立了一个备份存储库,并将所有参与者上传到GitHub,GitLab或任何其他支持Git的服务器。 我们可以一一推入分支,但是使用magic命令,我们可以将它们全部推入,这更快,更简单:
git remote add origin https://gitlab.com/KvanTTT/Family.git git push origin --all -u
要生成公共的家谱,您需要在启动生成器时传递--only-birth-events
标志。 在这种情况下,将创建每人一次提交(出生)。 否则,一个 社交网络 将生成社交图。
例子
作为一个最小的示例(至少将在所有地方使用),我创建了家谱,一个很大的示例是美国总统的树(2145人)。 它们分别在Kochurkins和Presidents存储库中可用。 为了创建自己的树,我使用了geni.com服务,从该服务将树导出到GEDCOM。 Gist上提供了用于创建家谱库的生成脚本。
在GitHub(以及GitLab)上,您可以浏览祖先和后代。 这类似于家谱Wiki系统Familypedia或WeRelate 。 但是,GitHub / GitLab更高级:可以轻松地从树中下载树(借助--clone
命令)。 最重要的是,您可以一次打开整个图形。 (由于某些原因,在现有的族谱程序中,打开小图很困难。)您可以使用其他工具(Web服务, Git Extesions , Sourcetree , GitKraken等)来完成此操作。 此外,与大多数家谱服务不同,这些服务可以免费使用。
值得注意的是,在GitHub / GitLab上甚至可以进行某种分析:您可以找出谁拥有最多的信息 关注了Instagram帐号 多事的生活。 或最公开的:“ Insights
选项卡按提交次数递减的顺序显示人员列表。
不幸的是,GitHub和GitLab不能正确显示大树,但它们存储正确-您可以打开存储库并进行检查。 这是我在GitLab Web界面中的树:
问题
目前还不清楚如何从源头上补充历史。 现在,您必须从GEDCOM文件开始生成它。 可能可以在重新设置rebase
的帮助下完成-您可以尝试在注释中说明。 最好将代码重写为“面向提交”,而不是“面向事件”,因为它更像是Git:实际上,分支是提交的序列,而不是单独的实体。 我也考虑过实现标签和子模块 ,但是现在我还不知道如何做得更好。
结论
如果将族谱的概念进一步扩展到开发人员的Web服务,则可以使用问题创建全局任务,并根据里程碑 (童年,青年,成年,老年人)进行分配。
除了家族树之外,您还可以使用Git编码编程语言的族谱树(甚至更怪异),语法树和任何树结构。 Git对于家庭主妇在巴西肥皂剧的角色之间建立联系也很有用:)
实际的好处:预热有助于更好地了解Git的结构,其命令以及用于描述家谱数据的GEDCOM格式。
文章的来源可在GitHub上找到 -如果发现任何错误或想要添加一些内容,请发送Pull Request。 为了转换为habr.com格式,我使用了MarkConv库。