Przeczytałem kilka pytań dotyczących prostych narzędzi do kontroli kodu źródłowego i Git wydawał się rozsądnym wyborem. Mam go uruchomionego i działa dobrze. Jednym z aspektów CVS, który mi się podoba, jest automatyczne zwiększanie numeru wersji.
Rozumiem, że w rozproszonym repozytorium ma to mniejszy sens, ale jako programista chcę / potrzebuję czegoś takiego. Pozwól mi wyjaśnić, dlaczego:
Używam Emacsa. Okresowo przeglądam i szukam nowych wersji plików źródłowych Lisp dla pakietów innych firm. Powiedzmy, że mam plik foo.el, który zgodnie z nagłówkiem ma wersję 1.3; jeśli sprawdzę najnowszą wersję i zobaczę, że jest to 1.143, 2.6 lub cokolwiek innego, wiem, że jestem daleko w tyle.
Jeśli zamiast tego zobaczę kilka 40-znakowych skrótów, nie będę wiedział, który jest później, ani nie mam pojęcia, ile jest później. Absolutnie nienawidziłbym tego, gdybym musiał ręcznie sprawdzać ChangeLogs tylko po to, aby dowiedzieć się, jak bardzo jestem nieaktualny.
Jako programista chcę rozszerzyć tę uprzejmość, tak jak to widzę, na ludzi, którzy używają moich wyników (i może żartuję sobie, że ktoś jest, ale zostawmy to na chwilę). Nie chcę pamiętać, aby za każdym razem zwiększać tę cholerną liczbę, sygnaturę czasową czy coś w tym rodzaju. To prawdziwa PITA i wiem to z doświadczenia.
Więc jakie mam alternatywy? Jeśli nie mogę uzyskać ekwiwalentu $ Id: $, jak jeszcze mogę podać to, czego szukam?
Powinienem wspomnieć, że oczekuję, że użytkownik końcowy NIE będzie miał zainstalowanego Gita, a nawet jeśli to zrobi, nie będzie miał lokalnego repozytorium (w rzeczywistości nie spodziewam się udostępnienia go w ten sposób).
źródło
filter-branch
czy czegoś.git describe
polecenie tuż przed kompilacją, zapisać dane wyjściowe w pliku nagłówkowym lub w inny sposób osadzić wartość w kodzie.Do tej pory istnieje wsparcie dla $ Id: $ w Git. Aby włączyć go dla pliku README , należy umieścić "README ident" w .gitattributes . Obsługiwane są symbole wieloznaczne w nazwach plików. Aby uzyskać szczegółowe informacje, zobacz man gitattributes .
źródło
$Id$
wspomniano. To, co jest przechowywane, jest dokładnie tym, co dostajesz. W każdym razie wersja należy do pełnego zbioru plików tworzących zatwierdzenie, a nie do jednego pliku w szczególności (ten pomysł jest pozostałością z czasów RCS, a może winę za to należy tutaj SCCS ... Ponieważ CVS to tylko gloryfikowana nakładka na RCS, a SVN stara się być podobnym do CVS, utknęło.).To nie jest nierozsądna prośba ze strony OP.
Mój przypadek użycia to:
/usr/local/bin
gdy będą gotowe.Używam trzech oddzielnych maszyn z tym samym repozytorium Git. Byłoby miło wiedzieć, w jakiej "wersji" pliku mam aktualnie dostęp,
/usr/local/bin
bez konieczności ręcznego wykonywania instrukcji "diff -u <wersja repo> <wersja w / usr / local / bin>".Dla tych z was, którzy są negatywni, pamiętajcie, że istnieją inne przypadki użycia. Nie wszyscy używają Gita do wspólnej pracy z plikami w repozytorium Git będącymi ich „ostateczną” lokalizacją.
W każdym razie sposób, w jaki to zrobiłem, polegał na utworzeniu pliku atrybutów w repozytorium w następujący sposób:
Następnie umieść $ Id $ gdzieś w pliku (lubię to wstawiać po shebangu).
Zatwierdzenie. Zauważ, że to nie powoduje automatycznego rozszerzenia, tak jak się spodziewałem. Musisz ponownie skopiować plik, na przykład
A potem zobaczysz rozszerzenie, na przykład:
Kilka przydatnych informacji. Jak włączyć ciąg ident dla repozytorium Git? .
źródło
git co
ma zrobić? Otrzymałem komunikat o błędzie „git: 'co' is not a git command. See 'git --help'.
” Powinien tak byćgit checkout
?Nie jestem pewien, czy to kiedykolwiek będzie w Git. Aby zacytować Linusa :
Jednak sprawdzenie dziennika jest dość łatwe - jeśli śledzisz gałąź stabilną foo.el, możesz zobaczyć, jakie nowe zatwierdzenia znajdują się w dzienniku gałęzi stabilnej, a których nie ma w Twojej lokalnej kopii. Jeśli chcesz symulować wewnętrzny numer wersji CVS, możesz porównać znacznik czasu ostatniego zatwierdzenia.
Edycja: powinieneś pisać lub używać do tego cudzych skryptów, oczywiście nie rób tego ręcznie.
źródło
$Id$
viaident
, jak wspomniano w innej odpowiedzi, pokazując, że nawet sam git nie jest zakładnikiem opinii Linusa.Jak napisałem wcześniej :
źródło
Miałem ten sam problem. Potrzebowałem wersji, która byłaby prostsza niż ciąg skrótu i dostępna dla osób używających tego narzędzia bez konieczności łączenia się z repozytorium.
Zrobiłem to za pomocą haka Git przed zatwierdzeniem i zmieniłem mój skrypt, aby mógł się automatycznie aktualizować.
Opieram wersję na liczbie wykonanych zatwierdzeń. Jest to niewielki przypadek wyścigu, ponieważ dwie osoby mogą zatwierdzić w tym samym czasie i obie myślą, że zatwierdzają ten sam numer wersji, ale nie mamy wielu programistów w tym projekcie.
Na przykład mam skrypt, który sprawdzam, który jest w Rubim i dodaję do niego ten kod - jest to dość prosty kod, więc łatwo jest przenieść na różne języki, jeśli sprawdzasz coś w innym języku (chociaż oczywiście jest to nie będzie łatwo działać z nieobsługiwanymi checkins, takimi jak pliki tekstowe). Dodałem:
Następnie dodaję opcję wiersza poleceń (-updateVersion) do skryptu, więc jeśli nazywam go „narzędziem -updateVersion”, wywołuje on po prostu updateVersion dla narzędzia, które modyfikuje samą wartość „MYVERSION”, a następnie kończy pracę (można niech zaktualizuje również inne pliki, jeśli są również otwarte, jeśli chcesz).
Po skonfigurowaniu przechodzę do głowy Gita i tworzę wykonywalny jednowierszowy skrypt bash w
.git/hooks/pre-commit
.Skrypt po prostu przechodzi do nagłówka katalogu Git i wywołuje mój skrypt z
-updateVersion
.Za każdym razem, gdy sprawdzam, uruchamiany jest skrypt przed zatwierdzeniem, który uruchamia mój skrypt z opcją -updateVersion, a następnie zmienna MYVERSION jest aktualizowana w oparciu o liczbę zatwierdzeń. Magia!
źródło
git updateVersion
? Proszę umieścić kilka próbek, jak to się nazywa.Jeśli posiadanie $ Keywords $ jest dla Ciebie niezbędne, to może powinieneś spróbować zamiast tego spojrzeć na Mercurial ? Ma rozszerzenie hgkeyword, które implementuje to, co chcesz. Mercurial i tak jest interesujący jako DVCS.
źródło
Coś, co jest robione z repozytoriami Git, to użycie
tag
obiektu. Można tego użyć do oznaczenia zatwierdzenia dowolnym ciągiem znaków i można go użyć do oznaczenia wersji. Możesz zobaczyć te tagi w repozytorium za pomocągit tag
polecenia, które zwraca wszystkie tagi.Łatwo jest sprawdzić tag. Na przykład, jeśli istnieje tag
v1.1
, możesz sprawdzić ten tag w gałęzi takiej jak ta:Ponieważ jest to obiekt najwyższego poziomu, zobaczysz całą historię tego zatwierdzenia, a także będziesz mógł uruchamiać różnice, wprowadzać zmiany i scalać.
Nie tylko to, ale znacznik pozostaje, nawet jeśli gałąź, w której się znajdował, została usunięta bez scalenia z powrotem do głównej linii.
źródło
export-subst
funkcjigitattributes(5)
. To oczywiście wymaga użyciagit archive
do tworzenia wydań i tylko w wynikowym pliku tar będą widoczne zmiany po podstawieniu.Jeśli dobrze rozumiem, zasadniczo chcesz wiedzieć, ile zatwierdzeń wydarzyło się w danym pliku od ostatniej aktualizacji.
Najpierw pobierz zmiany w zdalnym źródle, ale nie scalaj ich ze swoją
master
gałęzią:Następnie pobierz dziennik zmian, które zaszły w danym pliku między twoim
master
oddziałem a pilotemorigin/master
.To daje ci komunikaty dziennika wszystkich zatwierdzeń, które miały miejsce w zdalnym repozytorium od czasu ostatniego scalenia
origin/master
zmaster
.Jeśli chcesz tylko zliczać zmiany, prześlij ją do
wc
. Powiedz w ten sposób:źródło
Jeśli chcesz, aby ludzie mogli zorientować się, jak bardzo są nieaktualni, Git może ich o tym poinformować na kilka dość łatwych sposobów. Na przykład porównują daty ostatniego zatwierdzenia w swoim bagażniku i Twoim bagażniku. Mogą użyć,
git cherry
aby zobaczyć, ile zatwierdzeń wystąpiło w twoim pniu, których nie ma w ich.Jeśli to wszystko, czego chcesz, szukałbym sposobu, aby podać to bez numeru wersji.
Poza tym nie zawracałbym sobie głowy okazaniem uprzejmości nikomu, chyba że jesteś pewien, że tego chcą. :)
źródło
Aby zastosować rozszerzenie do wszystkich plików we wszystkich podkatalogach w repozytorium, dodaj
.gitattributes
plik do katalogu najwyższego poziomu w repozytorium (tj. Tam, gdzie normalnie umieszczasz.gitignore
plik) zawierający:Aby zobaczyć, jak to działa, musisz najpierw skutecznie wyrejestrować plik (i), na przykład usunąć je lub edytować w jakikolwiek sposób. Następnie przywróć je za pomocą:
I powinieneś zobaczyć
$Id$
zastąpiony czymś takim:Od
man gitattributes
:Ten identyfikator będzie się zmieniał za każdym razem, gdy zostanie zatwierdzona nowa wersja pliku.
źródło
Identyfikatory RCS są dobre dla projektów jednoplikowych, ale w przypadku każdego innego $ Id $ nic nie mówi o projekcie (chyba że wymusisz fikcyjne wpisy do fałszywego pliku wersji).
Wciąż może być ciekaw, jak uzyskać odpowiedniki $ Author $, $ Date $, $ Revision $, $ RCSfile $ itd. Na poziomie pliku lub zatwierdzenia (jak je umieścić tam, gdzie są niektóre słowa kluczowe pytanie). Nie mam odpowiedzi na te pytania, ale widzę wymóg ich aktualizacji, zwłaszcza gdy pliki (teraz w Git) pochodzą z systemów kompatybilnych z RCS (CVS).
Takie słowa kluczowe mogą być interesujące, jeśli źródła są dystrybuowane oddzielnie od dowolnego repozytorium Gita (to też robię). Moje rozwiązanie jest takie:
Każdy projekt ma własny katalog, aw katalogu głównym projektu mam plik tekstowy o nazwie,
.version
której zawartość opisuje aktualną wersję (nazwa, która będzie używana podczas eksportowania źródeł).Podczas pracy nad kolejną wersją skrypt wyodrębnia tę
.version
liczbę, deskryptor wersji Git (np.git describe
) I monotoniczny numer kompilacji w.build
(plus host i datę) do automatycznie wygenerowanego pliku źródłowego, który jest powiązany z ostatecznym programem, dzięki czemu można znaleźć z jakiego źródła i kiedy zostało zbudowane.Opracowuję nowe funkcje w oddzielnych gałęziach, a pierwszą rzeczą, którą robię, jest dodanie
n
(dla „następnego”) do.version
ciągu (wiele gałęzi pochodzących z tego samego katalogu głównego używałoby tej samej.version
liczby tymczasowej ). Przed wydaniem decyduję, które gałęzie połączyć (mam nadzieję, że wszystkie mają takie same.version
). Przed wykonaniem scalenia aktualizuję.version
do następnego numeru (aktualizacja główna lub drobna, w zależności od połączonych funkcji).źródło
Jeśli chcesz git commit informacji dostępnej w kodzie, to mają zrobić krok w pre-build, aby ją tam. W bash dla C / C ++ może to wyglądać mniej więcej tak:
prebuild.sh
z
version.h
wyglądem:Następnie, gdziekolwiek potrzebujesz tego w swoim kodzie
#include "version.h"
i referencjachgit_tag
lubgit_commit
w razie potrzeby.A twój
Makefile
może mieć coś takiego:Ma to tę zaletę, że:
Ta implementacja
prepublish.sh
ma wady:git_tag
/git_commit
nie uległa zmianie.git describe --tags --always --dirty
aby złapać ten przypadek użycia.Hodowca,
prebuild.sh
który mógłby uniknąć tych problemów, jest pozostawiony jako ćwiczenie dla czytelnika.źródło
Zgadzam się z tymi, którzy uważają, że zastępowanie tokenów należy do narzędzi do budowania, a nie do narzędzi do kontroli wersji.
Powinieneś mieć jakieś automatyczne narzędzie do ustawiania identyfikatorów wersji w źródłach w momencie oznaczania wydania.
źródło
Nazwy znaczników i inne powiązane informacje mogą być teraz automatycznie edytowane bezpośrednio w plikach przez Git za pomocą
export-subst
funkcjigitattributes(5)
. To oczywiście wymaga użyciagit archive
do tworzenia wydań i tylko w wynikowym pliku tar będą widoczne zmiany po podstawieniu.Na przykład w
.gitattributes
pliku umieść następującą linię:Następnie w plikach źródłowych możesz dodać taką linię:
I tak będzie wyglądać w wersji stworzonej na przykład przez
git archive v1.2.0.90
:źródło
Skoro używasz Emacsa, możesz mieć szczęście :)
Trafiłem na to pytanie przez przypadek, a także przez przypadek trafiłem na Lively kilka dni temu, pakiet Emacsa, który pozwala na posiadanie żywych fragmentów Emacsa Lispa w twoim dokumencie. Szczerze mówiąc nie próbowałem, ale przyszło mi do głowy, czytając to.
źródło
Pochodzę także z SCCS, RCS i CVS (
%W% %G% %U%
).Miałem podobne wyzwanie. Chciałem wiedzieć, w jakiej wersji znajduje się fragment kodu w każdym systemie, na którym jest uruchomiony. System może, ale nie musi być podłączony do żadnej sieci. System może mieć zainstalowany Git lub nie. W systemie może być zainstalowane repozytorium GitHub lub nie.
Chciałem tego samego rozwiązania dla kilku typów kodu (.sh, .go, .yml, .xml itp.). Chciałem, aby każda osoba bez znajomości Git lub GitHub mogła odpowiedzieć na pytanie „Jakiej wersji używasz?”
Tak więc napisałem coś, co nazywam opakowaniem wokół kilku poleceń Gita. Używam go do oznaczenia pliku numerem wersji i kilkoma informacjami. To rozwiązuje moje wyzwanie. To może ci pomóc.
https://github.com/BradleyA/markit
źródło
Aby rozwiązać ten problem dla siebie, utworzyłem mały „hack” jako punkt zaczepienia po zatwierdzeniu:
Bardziej szczegółowo udokumentowane w tym poście na moim blogu .
źródło