Moja organizacja rozważa przejście z SVN do Git. Jeden argument przeciwko przeprowadzce jest następujący:
Jak wykonujemy wersjonowanie?
Posiadamy dystrybucję SDK opartą na platformie NetBeans. Ponieważ wersje SVN są prostymi liczbami, możemy je wykorzystać do rozszerzenia numerów wersji naszych wtyczek i kompilacji SDK. Jak sobie z tym poradzić po przejściu do Git?
Możliwe rozwiązania:
- Używanie numeru kompilacji z Hudsona (Problem: musisz sprawdzić Hudsona, aby skorelować go z rzeczywistą wersją Gita)
- Ręczne podniesienie wersji w nocy i stabilne (Problem: Krzywa uczenia się, błąd ludzki)
Jeśli ktoś inny napotkał podobny problem i go rozwiązał, chcielibyśmy usłyszeć, jak to zrobić.
version-control
git
svn
builds
versioning
Erlend
źródło
źródło
git
tagu po każdej udanej kompilacji? Miałoby to tę dodatkową zaletę, że wyjaśnia, któregit
zatwierdzenia mają problemy z kompilacją lub testami, ponieważ pozostałyby one nieoznaczone.Odpowiedzi:
Użyj znaczników, aby oznaczyć zatwierdzenia numerami wersji:
Wciśnij tagi w górę - nie dzieje się to domyślnie:
Następnie użyj polecenia opisz :
To daje ci ciąg formatu:
źródło
git describe --long --tags --dirty --always
. „Brudny” powie ci, czy były jakieś lokalne zmiany, kiedy „opis” zostało zrobione (co oznacza, że nie może w pełni opisać stanu repo). „Zawsze” oznacza, że nie pojawi się błąd, gdy nie będzie żadnych tagów. Wróci do zwykłego skrótu zatwierdzenia. Możesz więc podać76001f2-dirty
jako przykład. Oczywiście widok „brudny” oznacza, że ktoś się pomylił.HEAD
jakov2.5
, możesz równie dobrze zinterpretować to jako początek cyklu wydania 2.5, a następnie oznaczv2.5-release
lub cokolwiek zechcesz.--match
opcji:git describe --long --tags --dirty --always --match 'v[0-9]\.[0-9]'
To dotyczy kilku projektów. Najlepszym rozwiązaniem, jakie dotychczas miałem, jest wygenerowanie numeru wersji takiego:
xy <liczba zatwierdzeń> .r <git-hash>
Zazwyczaj jest generowany przez nasz system kompilacji przy użyciu kombinacji jakiegoś statycznego pliku lub znacznika, aby uzyskać główne numery wersji
git rev-list HEAD | wc -l
(co było szybsze niż użyciegit log
), igit rev-parse HEAD
. Rozumowanie było następujące:Numer 2 jest niewidoczny dla większości ludzi, ale jest naprawdę ważny i bardzo trudny przy rozproszonej kontroli źródła. SVN pomaga w tym, dając ci jeden numer wersji. Okazuje się, że liczba zatwierdzeń jest tak bliska, jak to tylko możliwe, jednocześnie magicznie rozwiązując # 4. W obecności rozgałęzień nadal nie jest to wyjątkowe, w którym to przypadku dodajemy skrót, który również starannie rozwiązuje # 3.
Większość z nich miała na celu wdrożenie wdrażania za pomocą pipa Pythona. To gwarantowało,
pip install
że być może będzie to nieco dziwne podczas równoległego programowania (tj. Pakiety od ludzi z różnych gałęzi przenikną się, ale w deterministyczny sposób), ale po połączeniu wszystko się załatwi. Pomijając obecność ujawnionego rebase lub zmiany, działało to całkiem nieźle jak na powyższe wymagania.Jeśli się zastanawiasz, zdecydowaliśmy się umieścić r przed haszem z powodu jakiejś dziwności, w jaki sposób pakiet Python obsługuje litery w numerach wersji (tj. Ae jest mniejsze niż 0, co oznaczałoby, że „1.3.10.a1234” < „1.3.10” <„1.3.10.1234”).
źródło
Wersje są identyfikowane zaszyfrowane skrótami SHA1 wszystkich plików w drzewie katalogów przechowywanych podczas meldowania. Ten skrót jest przechowywany obok skrótów nadrzędnych kontroli, aby można było odczytać całą historię.
Spójrz na proces korzystania z „git-description” za pomocą GIT-VERSION-GEN i jak możesz to dodać poprzez proces kompilacji, kiedy otagujesz swoją wersję.
Oto fajny blog, który podaje przykład, jak zdobyć to, czego chcesz:
http://cd34.com/blog/programming/using-git-to-generate-an-automatic-version-number/
źródło
To może być trochę przesada, ale dam ci znać, jak to robimy.
Używamy rozgałęzionej struktury bardzo podobnej do tej .
Hudson opiera się na naszych „rozwijających się” gałęziach i zwiększa liczby kompilacji, zaczynając od 0. Numer kompilacji jest unikalny dla każdego projektu i jest oznaczany w kontroli wersji. Powodem jest to, że można dokładnie powiedzieć, na przykład, z której wersji kompilacji deweloperskiej pochodzi 42 (każdy projekt może mieć kilka równoległych gałęzi programistycznych, ponieważ każdy projekt może mieć kilka zespołów pracujących nad różnymi aspektami projektu).
Kiedy zdecydujemy, że konkretna kompilacja jest wystarczająca do wydania, zatwierdzenie, które ją uruchomiło, jest oznaczane numerem wersji, o czym decyduje marketing. Oznacza to, że zespoły deweloperów nie dbają o ostateczny numer wersji, a marketing może swobodnie przeszukiwać numery wersji według własnego uznania. Ostateczny numer wersji i numer kompilacji są obecne w wydanym produkcie.
Przykład: wersja 2.1.0 1337
Oznacza to, że w przypadku konkretnego wydania produktu możesz określić, który zespół pracował nad tym ostatnim, i możesz zapytać git o wszystkie zatwierdzenia poprzedzające wydanie, aby w razie potrzeby zdiagnozować problem.
źródło
Jon Purdy ma dobry pomysł.
git flow
ułatwia również faktyczne zarządzanie tymi oddziałami, a zarządzanie oddziałami jest argumentem przemawiającym za przejściem dogit
.Zacznijmy od podstawowego podsumowania
git
, ponieważ przychodzisz z perspektywysvn
-to-git
perspektywy. Rozważgit
następujące kwestie:Powyżej rozgałęziasz
master
siędevelop
(oznaczony przez\
) i rozgałęziaszdevelop
się nafeature
oddział. Scalamy te gałęzie z powrotem (oznaczone przez/
), z commits (-
) wzdłuż gałęzi. (Jeśli nie ma zatwierdzenia, ale scalenie jest po prawej stronie, istnieją.
wskaźniki wskazujące, że następne-
jest następne zatwierdzenie).Wystarczająco łatwe. Co jeśli mamy poprawkę w naszym głównym wydaniu?
Powyżej
develop
rozgałęziony zmaster
. Wykryty błądmaster
został naprawiony przez odgałęzieniemaster
, naprawienie go i ponowne połączeniemaster
. Następnie połączyliśmy sięmaster
wdevelop
, a następniedevelop
wfeature2
, który wprowadził nowy kod zhotfix
tych gałęzi.Po
feature2
ponownym połączeniu siędevelop
, jego historia obejmujedevelop
takżehotfix
. Podobniedevelop
jest połączyły sięfeature2
z nowym kodem zmaster
, więc łączeniedevelop
z powrotemmaster
stanie się gładko, jak to jest w oparciu o które zobowiązują sięmaster
w tym czasie-jak gdybyś rozgałęzionego odmaster
w tym momencie.Oto inny sposób na zrobienie tego.
Twoje 1.0 uwalnia się tagged-
1.0.1
,1.0.2
,1.0.3
, i tak dalej.Oto sztuczka: znalazłeś błąd w wersji 1.0 i dotyczy on wersji 1.1, 1.2 i 1.3. Co robisz?
Odgałęziasz swoją najnowszą lub najwcześniej utrzymaną wersję i naprawiasz ją. Następnie należy połączyć swój nowy
hotfix
oddział w1.3
-I w1.2
,1.1
i1.0
. Nie rozgałęziaj się w każdym z oddziałów wersji konserwacji; nie łączą1.0
sięmaster
ani nie łączą zmaster
powrotem1.0
. Weź jednąhotfix
gałąź i połącz ją ze wszystkimi gałęziami wersji. Jeśli wystąpią konflikty, powie ci; sprawdź swój kod, aby upewnić się, że zmiany są poprawne (git diff
jest twoim przyjacielem).Teraz ta konkretna zmiana jest stosowana wszędzie. Ród jest rozgałęziony, ale jest w porządku. To nie jest przypadkowe. Oznacz
1.3
głowę jako 1.3.17, połącz ją ze wszystkimi rozwijanymi funkcjami1.3
i przejdź dalej.git flow
Przedłużenie pomaga zarządzać tymi konserwacji, funkcji i oddziały poprawki dla Ciebie. Po wyłączeniu przepływu pracy jest to trywialne i sprawia ogromne problemy z zarządzaniem kodem źródłowym.Widziałem to w zespołach programistycznych, ale sam nie pracowałem tak głęboko jako programista, więc sam wciąż skupiam się na codziennej pracy.
źródło
Pro Git w sekcji 7.2 „Atrybuty Git” w części „Słowo kluczowe” Dodatek zawiera ładny przykład użycia filtrów rozmazywania i czyszczenia do generowania słów kluczowych w stylu RCS. Możesz użyć tej samej techniki do osadzania niektórych ciągów znaków w kodzie, sformatowanych i obliczonych zgodnie z twoimi regułami . Nadal możesz używać
git describe
jako punktu początkowego, ale masz możliwość przekształcenia się w bardziej odpowiednią formę i uzyskania wersji 2.5-14 feebdaed, na przykład, czyste 2.5.14źródło
git describe
wypisuje nazwę znacznika, chyba że--long
zostanie przekazana lub od ostatniego znacznika są zatwierdzenia, więc jest już idealnie czysta. Jeśli nie zmieniasz wartości domyślnych, dałoby to dokładnie to, czego chciałeś.