Pohon keluarga di dalam git

Selamat hari programmer! Saya berharap Anda melakukan komitmen yang lebih cerah, menggabungkan permintaan tarik, mengurangi konflik, dan agar cabang kehidupan Anda tetap relevan selama mungkin. Sebagai hadiah konseptual, saya mengusulkan implementasi silsilah keluarga melalui sistem kontrol versi Git. Yah ... kedengarannya seperti rencana!



Bagi mereka yang telah segera memahami segalanya, saya memberikan tautan ke kode sumber: GenealogyTreeInGit dan silsilah keluarga: presiden saya dan AS .


Selain itu, saya menerapkan grafik sosial sederhana. Ini tidak hanya menampilkan tingkat kekerabatan, tetapi juga status hubungan antara keturunan, acara-acara seperti pernikahan, perceraian, persalinan, serta kontribusi untuk hubungan tersebut.


Git


Biarkan saya mengingatkan Anda bahwa Git adalah salah satu sistem kontrol versi paling populer. Ini sangat kuat: Anda dapat melakukan perubahan, membuat (checkout) dan menggabungkan cabang, membandingkan berbagai versi file (berbeda), mengidentifikasi penulis string tertentu (menyalahkan), dan melakukan banyak hal lainnya.

Untungnya atau sayangnya, Git mirip dengan pemenang yang menulis ulang sejarah: memungkinkan Anda untuk mengubah tanggal, pesan, dan penulis komit. Tetapi ini memungkinkan Anda untuk menambahkan anggota keluarga, seolah-olah mereka adalah penulis acara yang dibuat pada tanggal tertentu.


Saya mulai dari kecil: Saya menulis beberapa perintah dan voila, sebuah fragmen dari pohon sudah siap. Baiklah Sekarang kita akan melakukan ini dengan seluruh pasukan keluarga. Saya akan dengan senang hati menulis 200 baris kode membingungkan untuk mereka, dan 10 ribu baris untuk presiden!


Sudahkah Anda menambahkan saya ke daftar idiot? Mogok. Tentu saja, saya mengotomatiskan proses dan menulis aplikasi untuk mengubah data silsilah menjadi urutan perintah Git. Ada beberapa format untuk data tersebut, saya memilih GEDCOM .


Gedcom


GEDCOM adalah spesifikasi untuk bertukar data silsilah. Format ini cukup lama, tetapi sederhana. Spesifikasi ini dijelaskan dengan baik di Internet. Ini didukung oleh hampir semua program silsilah, sehingga ada banyak contoh untuk itu: presiden AS, dinasti kerajaan, Shakespeare.

Saya menerapkan semua kekacauan ini dalam . NET Core โ€” nyaman dan lintas platform. Untuk parsing dan pemrosesan GEDCOM, ada beberapa perpustakaan C #, misalnya, GeneGenie.Gedcom , gedcomx-csharp . Saya memutuskan untuk menulis perpustakaan sendiri berdasarkan GedcomParser , karena memiliki kesalahan fatal ... Sebenarnya, tidak: Saya hanya ingin memahami formatnya sendiri dan menyingkirkan semua dependensi, yang akan memungkinkan, jika perlu, untuk dengan mudah mengirim proyek ke bahasa lain.


Generasi perintah


Inilah saatnya untuk memproses data yang diekstraksi dalam format yang mudah dan menghasilkan perintah Git untuknya. Saya memutuskan untuk menyortir semua peristiwa dalam urutan kronologis, dan kemudian membuat cabang, menggabungkan dan melakukan mereka dalam urutan tanggal yang naik. Sayangnya, tidak semua acara memiliki tanggal, jadi tidak mudah untuk menyortir semua acara dengan benar. 2 ^ 2 ^ 3 hari akan datang, dan saya menyadari bahwa pendekatan ini tidak sepenuhnya benar, karena pencarian mendalam-pertama akan jauh lebih mudah. Mungkin saya akan memperbaikinya nanti.


Inisialisasi


Pada tahap ini kita baru saja menginisialisasi repositori:


mkdir Family cd Family git init 

Acara


Di bagian skrip ini kami memproses dan melakukan semua acara. Untuk melakukan ini, perintah berikut digunakan:


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

Perintah pertama, checkout , membuat cabang untuk setiap orang. Bendera --orphan memungkinkan Anda membuat cabang yatim, yaitu cabang tanpa orang tua. Cabang yatim dibuat sekali - lain kali Anda beralih cabang menggunakan perintah checkout parameter ini dihilangkan. Pada akhirnya, hampir semua komitmen memiliki orang tua, kecuali leluhur yang paling jauh, karena yang sebelumnya tidak diketahui.


Perintah kedua, merge , satukan orang tua dan ciptakan anak. Kami menulis "Kelahiran" dengan tahun yang sesuai dalam pesan komit. Kami juga menentukan flag --allow-unrelated-histories dan --no-commit untuk mengaktifkan penggabungan cabang-cabang yatim dan untuk melakukan perubahan nanti. Beberapa anak diadopsi, jadi kami menulis "Diadopsi" untuk mereka. Lucu, tetapi Git memungkinkan pernikahan kelompok, mis. Adalah mungkin untuk menggabungkan lebih dari dua cabang sekaligus. Dan cabang-cabangnya tidak memiliki jenis kelamin, jadi Anda bisa menyebutnya "induk 1" dan "induk 2". Omong-omong, juga dimungkinkan untuk membuat orang tua tunggal.


Akhirnya, perintah ketiga, commit , membuat komit baru dengan pesan -m , tanggal --date dan penulis --author . Seperti yang telah saya sebutkan, Git memungkinkan Anda untuk mengubah pesan, penulis, dan tanggal komit. Selain itu, Git memungkinkan Anda membuat komit tanpa file dengan flag --allow-empty , dan tanpa pesan dengan flag --allow-empty-message . Penulis juga perlu menentukan email, tetapi Git menerima yang kosong - Anda hanya perlu menulis <> . Sayangnya, Git tidak menghormati orang tua: batas bawah dari tanggal komit adalah 1 Januari 1970 ("permulaan" Waktu Unix) โ€”tanggal sebelumnya akan ditampilkan secara tidak benar. Namun, Anda cukup menyebutkan tanggal sebenarnya dalam deskripsi. Namun demikian, Git menerima tanggal di masa depan - lihatlah anak saya Git. Omong-omong, juga dimungkinkan untuk membuat orang tua tunggal.


Grafik sosial


Dalam grafik sosial, peristiwa lain selain kelahiran juga disimpan: baptisan, pergantian tempat tinggal, kelulusan, pernikahan, perceraian, kematian, pemakaman. Setelah mati cabang menuju surga digital penampilan acara-acara berikutnya, kecuali pemakaman, tidak mungkin dilakukan di cabang. Di server, Anda dapat membuat cabang ini terlindungi (jangan khawatir: dimungkinkan untuk "menghidupkan kembali" di masa mendatang, jika perlu).


Acara "Pernikahan" memiliki dua leluhur - pasangan. "Perceraian" memiliki satu leluhur - "Pernikahan" sebelumnya. Keluarga dan mengasuh anak adalah pekerjaan, jadi kita dapat mengatakan bahwa setelah pernikahan seorang keturunan baru juga munculโ€” "hubungan" yang berakhir setelah perceraian (atau kematian pasangan). Ini dilanjutkan setelah pernikahan berikutnya. Selain itu, beberapa orang dapat berpartisipasi dalam suatu hubungan (menggabungkan beberapa cabang).


Finalisasi


Ceri kue: kami membuat repositori cadangan dan mengunggah semua peserta ke GitHub, GitLab, atau server lain yang mendukung Git. Kita dapat mendorong cabang satu per satu, tetapi menggunakan perintah ajaib, kita akan mendorong semuanya, yang jauh lebih cepat dan sederhana:


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

Untuk menghasilkan silsilah keluarga yang umum, Anda harus melewati flag --only-birth-events saat memulai generator. Dalam hal ini, satu komit per orang (kelahiran) akan dibuat. Kalau tidak, a jejaring sosial grafik sosial akan dihasilkan.


Contohnya


Sebagai contoh kecil, yang setidaknya akan bekerja di mana-mana, saya membuat pohon keluarga saya, dan contoh besar adalah pohon presiden AS (2145 orang). Mereka tersedia di masing-masing repositori Kochurkins dan Presiden . Untuk membuat pohon saya sendiri, saya menggunakan layanan geni.com , dari mana saya mengekspor pohon itu ke GEDCOM. Skrip yang dibuat untuk membuat repositori genealogis tersedia di Gist .



Di GitHub (dan GitLab juga), Anda dapat menavigasi leluhur dan keturunan. Ini mirip dengan sistem wiki silsilah Familypedia atau WeRelate . Namun, GitHub / GitLab lebih maju: pohon mudah diunduh darinya (dengan bantuan perintah --clone ). Dan yang paling penting, Anda dapat membuka seluruh grafik sekaligus. (Dalam program silsilah yang ada, untuk beberapa alasan, ada kesulitan dengan membuka bahkan grafik kecil.) Dan Anda dapat melakukan ini dengan menggunakan alat yang berbeda (layanan web, Git Extesions , Sourcetree , GitKraken dan lainnya). Selain itu, layanan ini dapat digunakan secara gratis, tidak seperti kebanyakan layanan silsilah.


Patut dicatat bahwa pada GitHub / GitLab bahkan beberapa jenis analitik tersedia: Anda dapat mengetahui siapa yang memiliki paling banyak mengikuti akun Instagram kehidupan penuh peristiwa. Atau yang paling umum: tab Insights menampilkan daftar orang dalam rangka mengurangi jumlah komitmen.



Sayangnya, GitHub dan GitLab tidak menampilkan pohon besar dengan benar, tetapi mereka disimpan dengan benar - Anda dapat membuka repositori dan memeriksa. Ini pohon saya di antarmuka web GitLab:



Masalah


Tidak begitu jelas bagaimana melengkapi sejarah dari akarnya. Untuk saat ini Anda harus membuatnya dari awal dari file GEDCOM. Mungkin ini dapat dilakukan dengan bantuan rebase โ€” Anda dapat mencoba dan memberi tahu di komentar. Akan lebih baik untuk menulis ulang kode untuk membuatnya "berorientasi komit", bukan "berorientasi pada peristiwa", karena lebih mirip Git: pada kenyataannya, cabang adalah urutan komit, bukan entitas yang terpisah. Saya juga berpikir tentang menerapkan tag dan submodul , tetapi untuk sekarang saya tidak tahu bagaimana melakukannya dengan lebih baik.


Kesimpulan


Jika Anda memperluas gagasan tentang silsilah keluarga lebih jauh ke layanan web untuk pengembang, maka dengan menggunakan masalah Anda dapat membuat tugas global dan mendistribusikannya sesuai dengan tonggak sejarah : masa kanak-kanak, remaja, dewasa, dewasa.


Selain pohon keluarga, Anda dapat menggunakan Git untuk menyandikan pohon silsilah bahasa pemrograman (ini bahkan lebih geeky), pohon sintaksis, dan struktur pohon apa pun. Git juga dapat bermanfaat bagi ibu rumah tangga untuk membangun hubungan antara karakter opera sabun Brasil :)


Manfaat praktis: pemanasan ini membantu untuk lebih memahami struktur Git, perintahnya, dan format GEDCOM untuk menggambarkan data silsilah.


Sumber artikel tersedia di GitHub - silakan kirim Permintaan Tarik jika Anda menemukan kesalahan atau ingin menambahkan sesuatu. Untuk mengkonversi ke format habr.com, saya menggunakan perpustakaan MarkConv .

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


All Articles