Git ile sayısal bir versiyonlama planına nasıl ulaşırsınız?


131

Kuruluşum SVN'den Git'e geçmeyi düşünüyor. Taşınmaya karşı bir argüman şöyledir:

Versiyonu nasıl yaparız?

NetBeans Platformuna dayanan bir SDK dağıtımımız var. SVN revizyonları basit sayılar olduğundan, bunları eklentilerimizin ve SDK sürümlerinin sürüm numaralarını genişletmek için kullanabiliriz. Git'e taşınırken bununla nasıl başa çıkacağız?

Olası çözümler:

  • Hudson'dan derleme numarasını kullanarak (Problem: bunu gerçek Git sürümüyle ilişkilendirmek için Hudson'ı kontrol etmeniz gerekir)
  • Gecelik ve kararlı sürümün manuel olarak yükseltilmesi (Sorun: Öğrenme eğrisi, insan hatası)

Başka biri de benzer bir sorunla karşılaştıysa ve çözerse, nasıl olduğunu duymayı çok isteriz.


3
Her başarılı kurulumdan sonra otomatik olarak bir etiket eklemek için hudson ( jenkins değil mi?) Sunucunuzu bulabilir misiniz git? Bu, gitetiketlenmeden kalmaya devam edeceğinden, hangi sözleşmelerin sorunları veya test hataları oluşturduğunu gerçekten netleştirmesinin avantajını sağlayacaktır .
Mark Booth


Bir yan not olarak, derleme zamanlarını izleyerek derleme sayısını etiketine ekleyebilirsiniz .
Shahbaz

Uygulanabilir bir çözüm olup olmadığından emin değiliz, peki her inşaattan hemen önce git'den svn deposuna ihracat yapmaya ne dersiniz? Sonra sadece svn deposundan inşa edin - eğer merkezileşmiş istediğimiz buysa, onu kullanın.
Jonny

Yanıtlar:


152

Sürüm numaralarını içeren taahhütleri işaretlemek için etiketleri kullanın :

git tag -a v2.5 -m 'Version 2.5'

Etiketleri giriş yönünde itin - bu varsayılan olarak yapılmaz:

git push --tags

Ardından tarif komutunu kullanın:

git describe --tags --long

Bu size biçimin bir dizesini verir:

v2.5-0-gdeadbee
^    ^ ^^
|    | ||
|    | |'-- SHA of HEAD (first seven chars)
|    | '-- "g" is for git
|    '---- number of commits since last tag
|
'--------- last tag

Kabul ediyorum - Eğer gerekirse, gecelik etiket numaralandırmayı otomatikleştirmek kolay olmalı ve kararlı bir ürün tanıtımı yine de el ile yapılıyor.
İşe yaramaz

20
Küçük gelişme: git describe --long --tags --dirty --always. 'Kirli', 'açıklama' yapıldığında yerel değişiklikler olup olmadığını söyleyecektir (yani, deponun durumunu tam olarak tanımlayamaz). 'Her zaman', etiket olmadığında hata almayacağınız anlamına gelir. Sadece bir bağlılık karmaşasına düşecek. Böylece 76001f2-dirtybir örnek olarak alabilirsiniz . Açıkçası, 'kirli' görünce biri berbat anlamına gelir.
Mike Weller,

1
Bu etiket en son üretildiğinde nasıl çalışır ? Normalde, yapımlarınızın ürününüzün bir sonraki sürümüne sahip olmasını isteyeceksiniz . Ancak bu durumda her zaman son sürümü kullanmak zorunda kalacaklar . Sadece son, sevk edilen inşa uygun numaraya sahip olacaktır.
void.pointer

@ void.pointer: Elbette, bu sürüm numarası “hangi sürüm hangi sürüm için geçerliydi?” sorusunu yanıtlar, “hangi sürüm hangi sürümde olacak?” Ancak, etiketleri farklı yorumlamakta özgürsünüz. Örneğin, HEADolarak etiketlerseniz v2.5, bunu 2.5 sürüm döngüsünün başlangıcı olarak yorumlayabilir , daha sonra istediğiniz şekilde etiketleyebilirsiniz v2.5-release.
Jon Purdy,

8
Başka bir küçük gelişme. Eğer başka etiketlere sahip olmak istiyorsanız, ancak revizyon oluşturma için özel olarak tasarlanmış bir etiket kullanmak istiyorsanız, aşağıdaki --matchgibi bir seçenek kullanabilirsiniz :git describe --long --tags --dirty --always --match 'v[0-9]\.[0-9]'
Alexander Amelkin

42

Bu benim için birkaç projede ortaya çıktı. Şimdiye kadar sahip olduğum en iyi çözüm şöyle bir sürüm numarası oluşturmak:

xy <işlem sayısı> .r <git-hash>

Genelde, temel revizyon numaralarını git rev-list HEAD | wc -l(kullanmaktan daha hızlı olan git log) elde etmek için bazı statik dosya veya etiketlerin bir kombinasyonu kullanılarak derleme sistemimiz tarafından üretilir ve git rev-parse HEAD. Sebep şöyle oldu:

  1. Açıkça üst seviye sürümleme yapabilme yeteneğine ihtiyacımız vardı (iexy)
  2. Paralel gelişme gerçekleşirken, ASLA aynı sürüm numarasını üretmememiz gerekiyordu.
  3. Bir sürümün nereden geldiğini kolayca bulmak istedik.
  4. Paralel çizgiler birleştirildiğinde, yeni sürümün her iki daldan da daha yükseğe çıkmasını istedik.

2 sayısı çoğu insan için görünmez, ancak dağıtılmış kaynak kontrolü için gerçekten önemli ve gerçekten zor. SVN size tek bir revizyon numarası vererek bu konuda yardımcı olur. Bir taahhüt sayısının olabildiğince yakın olduğu ve sihirli bir şekilde 4. çözüme ulaşıldığı ortaya çıktı. Dalların varlığında, bu hala benzersiz değildir; bu durumda, # 3'ü de düzgün bir şekilde çözen karışı ekleriz.

Bunların çoğu Python'un piposu ile konuşlandırmak içindi. Bu, pip installparalel gelişim sırasında belki biraz garip olacağını garanti eder (yani farklı dallardaki insanlardan gelen paketler birbirleriyle karışabilir, ancak belirleyici bir tarzda), ama birleştikten sonra her şey yoluna girdi. Açığa çıkmış bir rebase veya düzeltmenin varlığını yasaklayan bu, yukarıdaki şartlar için oldukça iyi sonuç verdi.

Merak ediyorsanız, Python ambalajının sürüm numaralarındaki harfleri nasıl kullandığıyla ilgili bazı garipliklerden dolayı has'ların önüne koymayı seçtik (yani ae 0'dan küçük, "1.3.10.a1234" olur < "1.3.10" <"1.3.10.1234").


1
btw, kontrol etmeden önce git-hash'ı belirleme konusunda tavuk yumurtası sorunuyla nasıl başa çıktınız? Bir tür .gitignore veya başka bir numara kullandınız mı?
kfmfe04

3
Yapmadım Paketleme zamanı gelene kadar karma kullanmıyorum, bu da check-in işleminden çok sonra. Farklı dillerin bunu enjekte etmenin farklı yolları vardır. Python için './setup.py egg_info -b ". $ {BUILD_VERSION}" sdist' kullanıyorum. C ve C ++ için derleme sırasında bir makroyu 'CFLAGS = -D "$ {BUILD_VERSION}"' ile tanımlarım. Git için bağlantı zamanında 'git install -ldflags appmodule.BuildVersion "-X. $ {BUILD_VERSION}"' ile bir sembol tanımlarım.
Jayson,

1
Bu en iyi cevap olmalı.
alvinabad

çok iyi bir cevap
haelix

9

Bu biraz fazla olabilir, ama nasıl yaptığımızı size bildiririm.

Biz çok benzeyen bir dallanma yapısı kullanın bu .

Hudson bizim "gelişme" dallarımızı oluşturur ve artışlar 0'dan başlayan sayıları artırır. Yapım sayısı her projeye özgüdür ve sürüm kontrolünde etiketlenir. Bunun nedeni, tam olarak hangi gelişmekte olan 42. branş yapısının (42) geldiğini söyleyebilmenizdir (örneğin, her bir projenin paralel olarak birkaç geliştirme dalı olabilir, çünkü her projenin, projenin farklı yönlerinde çalışan birkaç ekibi olabilir).

Belirli bir derlemenin yayınlanacak kadar iyi olduğuna karar verdiğimizde, bu yapıyı tetikleyen taahhüt, pazarlama tarafından karar verilen bir sürüm sürüm numarasıyla etiketlenir. Bu, geliştirme ekiplerinin son sürüm numarasının ne olduğu ile ilgilenmediği ve pazarlamanın sürüm numaralarını uygun gördüğü şekilde değiştirmekte özgür olduğu anlamına gelir. Son sürüm numarası ve yapı numarası, serbest bırakılan üründe bulunur.

Örnek: 2.1.0 build 1337

Bu, belirli bir ürün sürümü için, üzerinde çalışan son ekibin hangisi olduğunu söyleyebilir ve ihtiyaç duyduğunuzda bir sorunu teşhis etmek için serbest bırakmaya giden tüm komisyonlar için git'i sorgulayabilirsiniz.


8

Sürümler, check-in sırasında depolanan dizin ağacındaki tüm dosyaların SHA1 karma değerlerine sahip olarak tanımlanır. Bu özet, tüm öykülerin okunabilmesi için ebeveynlerin check-in işlemlerinin karma değerleri ile birlikte saklanır.

GIT-VERSION-GEN yolu ile 'git-Description' kullanma sürecine ve sürümünüzü etiketlerken bunu derleme işleminizle nasıl ekleyebileceğinize bir bakın.

İstediğinizi nasıl elde edeceğinize dair bir örnek veren güzel bir blog:

http://cd34.com/blog/programming/using-git-to-generate-an-automatic-version-number/


0

Jon Purdy'nin doğru fikri var. git flowbu dalların fiili yönetimini de kolaylaştırır ve şube yönetimi, taşınmak için bir argümandır git.

Temel bakış açısıyla başlayalım git, çünkü siz perspektiften geliyorsunuz . Aşağıdakileri göz önünde bulundurun :svngitgit

master--...............-.....-..............-
        \             /     /              /
         ---develop---------............../
                            \            /
                             --feature---

Yukarıda, sen şube masteriçin develop(ile gösterilir \) ve dal developbir karşı featuredalı. Bu dalları /, -bir dal boyunca taahhütler ( ) ile birlikte (ile gösterilir ) birleştiririz . (Eğer bir taahhüt yoksa ancak birleşme sağa giden yoldur ., bir sonrakinin -bir sonraki taahhüdün olduğunu gösteren göstergeler vardır ).

Yeterince kolay. Ana sürümümüzde bir düzeltme varsa ne olur?

master--...............-.....-................-...........-.........-
        \             /     /                / \         /|        /
         \           /     /                /   -hotfix-- V       /
          ---develop---------............../..............-...----
                             \            / \             V   /
                              --feature---   --feature2...----

Yukarıda, developdallı master. Keşfedilen hata master, dallanma master, sabitleme ve tekrar bir araya gelme ile giderildi master. Sonra birleşti masteriçine developve sonra developiçinefeature2 gelen yeni kodu haddelenmiş olan hotfixbu kola.

Eğer birleştirdiğinizde feature2geri develop, tarihçesi içerir developile hotfix. Aynı şekilde, developbirleştirilir feature2yeni kodla masterböylece birleştirme developgeri mastero dayanıyor gibi ki taahhüt üzerine, aksamadan olur mastero zaman-gibi gelen kollara olsaydı en mastero noktada.

İşte bunu yapmanın başka bir yolu.

master--..........-........-
        \        /\       /
         ---1.0--  --1.1-- 

Kişisel 1,0 bültenleri tagged- olsun 1.0.1, 1.0.2, 1.0.3ve benzeri.

Şimdi burada bir numara: 1.0'da bir hata buldunuz ve 1.1, 1.2 ve 1.3'ü etkiliyor. Ne yaparsın?

En son veya en erken sürdürülen sürümünüzü alırsınız ve düzeltin. Sonra yeni birleştirmek hotfixiçine dalını 1.3içine -ve 1.2, 1.1ve 1.0. Bakım sürümü dallarının her birinden dallanma; birleştirmezseniz 1.0içine masterveya birleştirme mastergeri içine 1.0. Bir hotfixdalı alın ve tüm sürüm dallarınızla birleştirin. Çatışma varsa, size söyleyecektir; değişikliklerin doğru olduğundan emin olmak için kodunuzu inceleyin ( git diffarkadaşınızdır).

Şimdi bu değişiklik her yere uygulandı. Soy, dallanmış, ama sorun değil. Bu gelişigüzel değil. 1.3Kafayı 1.3.17 olarak etiketleyin, ilerleyen her özelliğe dallayın 1.3ve ilerleyin.

git flowUzatma sizin için bu bakım, özelliği ve düzeltme dalları yönetmenize yardımcı olur. İş akışını azalttığınızda, bu önemsizdir ve kaynak kodu yönetimi dışında büyük miktarda sorun çıkarır.

Bunu programlama takımlarında gördüm, ancak bunu kendim de bir programcı olarak çok fazla yapmadım, bu yüzden hala günlük iş akışını kendimden geçiriyorum.


-6

"Anahtar Kelime" bölümündeki "Git Özellikleri" bölümündeki Pro Git, Genişletme bölümünde, RCS stili anahtar kelimeler üretmek için leke ve temiz filtrelerin kullanılmasına ilişkin güzel bir örnek bulunmaktadır. Kurallara göre biçimlendirilmiş ve hesaplanmış bazı sürüm dizgelerini koda gömmek için aynı tekniği kullanabilirsiniz . Hala edebilirsiniz kullanmak bir başlangıç noktası olarak, ancak herhangi bir daha uygun forma dönüştürmek ve 2.5.14 v2.5-14-feebdaed, örneğin, temiz almak olanağına sahipgit describe


9
-1 ad hominem saldırıları için tamamen çağrılmayan iyi bir cevabı mahvettiği için.
Jörg W Mittag

9
Söyleyecek olanı git-oğlanların sana oy vermesiydi . Kolayca biraz alçakgönüllü olmayı tercih eden insanlar olabilir .
Mark Booth,

Bilginize, cevabı az önce düzenledim.
Keith Thompson

git describeGeçmediği sürece etiket ismini --longçıkarır veya son etiketten bu yana taahhütler olur, bu yüzden zaten tamamen temiz. Varsayılanları değiştirmeseydiniz, tam olarak istediğinizi vermiş olacaktı.
strcat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.