Organisasi saya sedang mempertimbangkan untuk pindah dari SVN ke Git. Salah satu argumen yang menentang perpindahan adalah sebagai berikut:
Bagaimana cara kita membuat versi?
Kami memiliki distribusi SDK berdasarkan Platform NetBeans. Karena revisi SVN adalah angka sederhana, kita dapat menggunakannya untuk memperpanjang nomor versi plugin dan build SDK kami. Bagaimana kita menangani ini ketika kita pindah ke Git?
Solusi yang memungkinkan:
- Menggunakan nomor build dari Hudson (Masalah: Anda harus memeriksa Hudson untuk menghubungkannya dengan versi Git yang sebenarnya)
- Meningkatkan versi secara manual untuk malam dan stabil (Masalah: Kurva pembelajaran, kesalahan manusia)
Jika ada orang lain yang mengalami masalah serupa dan menyelesaikannya, kami senang mendengarnya.
version-control
git
svn
builds
versioning
Hapus
sumber
sumber
git
tag setelah setiap build berhasil? Ini akan memiliki keuntungan tambahan yang membuatnya benar-benar jelasgit
komit mana yang telah membangun masalah atau kegagalan pengujian, karena mereka akan tetap tidak ditandai.Jawaban:
Gunakan tag untuk menandai komit dengan nomor versi:
Tag push upstream — ini tidak dilakukan secara default:
Kemudian gunakan perintah uraikan :
Ini memberi Anda serangkaian format:
sumber
git describe --long --tags --dirty --always
. 'Kotor' akan memberi tahu Anda jika ada perubahan lokal saat 'uraikan' dilakukan (artinya itu tidak dapat sepenuhnya menggambarkan keadaan repo). 'Selalu' berarti Anda tidak akan mendapatkan kesalahan saat tidak ada tag. Ini akan mundur ke hanya hash komit. Jadi bisa Anda dapatkan76001f2-dirty
sebagai contoh. Jelas, melihat 'kotor' berarti seseorang mengacau.HEAD
sebagaiv2.5
, Anda bisa mengartikannya sebagai awal dari siklus rilis 2.5, lalu memberi tagv2.5-release
atau apa pun yang Anda suka.--match
opsi seperti ini:git describe --long --tags --dirty --always --match 'v[0-9]\.[0-9]'
Ini muncul pada beberapa proyek untuk saya. Solusi terbaik yang saya miliki sejauh ini adalah menghasilkan nomor versi seperti ini:
xy <jumlah komit> .r <git-hash>
Biasanya, ini dibuat oleh sistem build kami menggunakan kombinasi beberapa file atau tag statis untuk mendapatkan angka revisi utama,
git rev-list HEAD | wc -l
(yang lebih cepat daripada menggunakangit log
), dangit rev-parse HEAD
. Alasannya adalah sebagai berikut:Nomor 2 tidak terlihat oleh kebanyakan orang, tetapi sangat penting, dan sangat sulit dengan kontrol sumber yang didistribusikan. SVN membantu dengan ini dengan memberi Anda satu nomor revisi. Ternyata jumlah komit sedekat yang Anda bisa dapatkan, sementara secara ajaib menyelesaikan # 4 juga. Di hadapan cabang, ini masih tidak unik, dalam hal ini kita menambahkan hash, yang juga memecahkan # 3 dengan rapi.
Sebagian besar dari ini adalah untuk mengakomodasi penyebaran melalui pip Python. Ini menjamin bahwa
pip install
mungkin akan sedikit aneh selama pengembangan paralel (yaitu paket dari orang-orang di cabang yang berbeda akan berbaur, tetapi dengan cara deterministik), tetapi setelah bergabung, semuanya beres. Kecuali adanya rebase atau amandemen yang terbuka, ini bekerja cukup baik untuk persyaratan di atas.Jika Anda bertanya-tanya, kami memilih untuk meletakkan r di depan hash karena beberapa keanehan dengan bagaimana kemasan Python menangani huruf dalam nomor versi (yaitu ae kurang dari 0, yang akan menghasilkan "1.3.10.a1234" < "1.3.10" <"1.3.10.1234").
sumber
Ini mungkin agak berlebihan, tetapi saya akan memberi tahu Anda bagaimana kami melakukannya.
Kami menggunakan struktur percabangan yang sangat mirip dengan ini .
Hudson membangun dari cabang "mengembangkan" kami dan meningkatkan angka mulai dari 0. Angka build unik untuk setiap proyek dan ditandai dalam kontrol versi. Alasannya adalah agar Anda dapat mengetahui dengan tepat dari mana pembangunan cabang 42 berasal, misalnya (setiap proyek dapat memiliki beberapa cabang yang dikembangkan secara paralel, karena setiap proyek dapat memiliki beberapa tim yang mengerjakan aspek berbeda dari proyek).
Ketika kami memutuskan bahwa build tertentu cukup bagus untuk dirilis, komit yang memicu build tersebut akan ditandai dengan nomor versi rilis, yang diputuskan oleh pemasaran. Ini berarti bahwa tim pengembang tidak peduli tentang nomor versi terakhir dan pemasaran bebas untuk mengacak-acak nomor versi yang dianggap sesuai. Nomor versi final dan nomor build keduanya ada dalam produk yang dirilis.
Contoh: 2.1.0 build 1337
Ini berarti, untuk rilis produk tertentu, Anda dapat mengetahui mana tim terakhir yang telah mengerjakannya dan Anda dapat meminta git untuk semua komitmen yang akan dirilis untuk mendiagnosis masalah jika perlu.
sumber
Versi diidentifikasi hashing hash SHA1 dari semua file di pohon direktori tersimpan pada saat checkin. Hash ini disimpan di samping hash checkin induk agar riwayat lengkap dapat dibaca.
Lihatlah proses menggunakan 'git-uraikan' dengan cara GIT-VERSION-GEN dan bagaimana Anda dapat menambahkan ini melalui proses build Anda ketika Anda menandai rilis Anda.
Berikut adalah blog yang bagus yang memberikan contoh cara mendapatkan apa yang Anda inginkan:
http://cd34.com/blog/programming/using-git-to-generate-an-automatic-version-number/
sumber
Jon Purdy memiliki ide yang tepat.
git flow
membuat pengelolaan cabang-cabang ini menjadi mudah, juga, dan manajemen cabang merupakan argumen untuk pindah kegit
.Mari kita mulai dengan ikhtisar dasar
git
, karena Anda datang dari perspektif-svn
ke-git
. Pertimbangkangit
hal-hal berikut:Di atas, Anda bercabang
master
kedevelop
(dilambangkan dengan\
), dan bercabangdevelop
kefeature
cabang. Kami menggabungkan cabang-cabang itu cadangan (dilambangkan dengan/
), dengan komit (-
) di sepanjang cabang. (Jika tidak ada komit tetapi gabungannya adalah jalan ke kanan, ada.
indikator untuk menunjukkan bahwa-
komit berikutnya adalah komit berikutnya).Cukup mudah. Bagaimana jika kami memiliki perbaikan terbaru di rilis utama kami?
Di atas,
develop
bercabang darimaster
. Bug yang ditemukan dimaster
diperbaiki dengan bercabang darimaster
, memperbaikinya, dan menggabungkan kembali kemaster
. Kami kemudian bergabungmaster
ke dalamdevelop
, dan kemudiandevelop
kefeature2
, yang menggulung kode baru darihotfix
cabang-cabang ini.Saat Anda bergabung
feature2
kembali kedevelop
, riwayatnya termasukdevelop
denganhotfix
. Demikian juga,develop
digabungfeature2
dengan kode baru darimaster
, jadi penggabungandevelop
kembalimaster
akan terjadi tanpa hambatan, karena didasarkan pada komit padamaster
saat itu — seolah-olah Anda telah bercabangmaster
pada saat itu.Jadi, inilah cara lain untuk melakukan itu.
Anda 1.0 rilis mendapatkan tagged-
1.0.1
,1.0.2
,1.0.3
, dan sebagainya.Sekarang inilah triknya: Anda menemukan bug di 1.0 dan itu mempengaruhi 1.1, 1.2, dan 1.3. Apa yang kamu kerjakan?
Anda bercabang rilis rilis terbaru atau paling awal dipertahankan dan memperbaikinya. Kemudian Anda menggabungkan baru Anda
hotfix
cabang ke1.3
-dan dalam1.2
,1.1
dan1.0
. Jangan bercabang dari masing-masing cabang versi pemeliharaan; tidak menggabungkan1.0
ke dalammaster
atau menggabungkanmaster
kembali ke1.0
. Ambil satuhotfix
cabang dan gabungkan ke semua cabang versi Anda. Jika ada konflik, itu akan memberi tahu Anda; tinjau kode Anda untuk memastikan perubahannya benar (git diff
adalah teman Anda).Sekarang perubahan spesifik diterapkan di mana-mana. Silsilahnya bercabang, tetapi tidak apa-apa. Itu tidak sembarangan.
1.3
Beri tag pada head sebagai 1.3.17, gabungkan ke setiap fitur dalam proses yang bercabang1.3
, dan lanjutkan.The
git flow
ekstensi membantu mengelola pemeliharaan, fitur, dan cabang perbaikan terbaru ini untuk Anda. Setelah Anda menyelesaikan alur kerja, ini sepele dan mengeluarkan banyak masalah dari manajemen kode sumber.Saya telah melihat ini dilakukan pada tim pemrograman, tetapi saya sendiri belum bekerja sedalam itu sebagai seorang programmer, jadi saya masih memikirkan alur kerja sehari-hari saya sendiri.
sumber
Pro Git di bagian 7.2 "Atribut Git" di bagian "Kata Kunci" Ekspansi berisi contoh yang bagus tentang penggunaan filter noda & bersih untuk menghasilkan kata kunci gaya RCS. Anda dapat menggunakan teknik yang sama untuk menanamkan string versi-beberapa ke dalam kode, diformat dan dihitung sesuai dengan aturan Anda . Anda masih dapat menggunakan
git describe
sebagai titik menatap, tetapi Anda memiliki kemungkinan untuk berubah ke bentuk yang lebih tepat dan dapatkan dari v2.5-14-feebdaed, misalnya, bersihkan 2.5.14sumber
git describe
menampilkan nama tag kecuali jika--long
dilewatkan atau ada komitmen sejak tag terakhir, jadi sudah benar-benar bersih. Jika Anda tidak mengubah default, itu akan memberi Anda apa yang Anda inginkan.