Co to znaczy atomowe zatwierdzanie dla systemu kontroli wersji?

34

Jednym z powodów, dla których programiści wolą SVN od CVS, jest to, że pozwala na zatwierdzanie atomów? Co to znaczy ?

Maniak
źródło
To może komuś pomóc , wyjaśnia, co to jest (używa git jako przykładu, ale może być możliwe do zastosowania w innych VCS)
Fagner Brack

Odpowiedzi:

69

Oznacza to, że kiedy wykonujesz zatwierdzenie w systemie kontroli wersji, albo wszystko, co chcesz zatwierdzić, przechodzi, LUB nic nie robi.

W CVS, kiedy próbujesz zatwierdzić, możliwe jest, że zatwierdzenie zakończy się powodzeniem na kilku plikach, a następnie zawiedzie na kilku innych (ponieważ zostały zmienione). Powoduje to, że repozytorium znajduje się w niefortunnym stanie, ponieważ nie ma połowy twojego zatwierdzenia i jest prawdopodobne, że pozostawiłeś rzeczy w stanie, w którym nie będą się kompilować lub gorzej. Teraz musisz się spieszyć i zintegrować wszelkie zmiany, abyś mógł zatwierdzić inne pliki, zanim ktoś inny będzie musiał zaktualizować i uzyskać zepsuty zestaw zmian.

W SVN tak się nie stanie - SVN albo zatwierdzi wszystko, co zmieniłeś, albo zawiedzie cały zestaw zmian. Dlatego nigdy nie pozostawisz repozytorium w stanie uszkodzonym z powodu problemów z zatwierdzaniem.

Michael Kohne
źródło
9
Ważnym rezultatem jest to, że jeśli sprawdzeniu w danym stanie wtedy wynik jest zawsze spójna (wyjąwszy żadnej obsługi błędu, takie jak zapominając popełnić plik, oczywiście): Jest to zarówno z przed commit lub po zatwierdzenie i nic pomiędzy. W CVS może to być „w połowie zatwierdzenia”. Zachowanie SVN jest bardzo miłe w przypadku ciągłej integracji. W przypadku systemów CVS systemy te zastosowały wymuszenie „spokojnego okresu”, w którym korzystały z danego wymeldowania tylko wtedy, gdy nie zobowiązały się do wykonania, o ile wykonano określoną liczbę sekund / minut po wymeldowaniu.
Joachim Sauer
2
mroczne wspomnienia z używania CVS uderzają mnie, kiedy to czytam.
shabunc
9
@Spoike - prawda, ale to celowy akt. W CVS problemy mogą się zdarzyć bez Twojej winy, podczas gdy w SVN musisz nad tym popracować.
Michael Kohne,
3
@DanNeely - CVS zatwierdza je jeden po drugim. Dlatego otrzymujesz częściowe zatwierdzenia - niektóre pliki przechodzą, a następnie zatrzymują się, gdy trafią do jednego, którego nie mogą zatwierdzić (z powodu konfliktu). Myślę, że jest to wynik CVS, który pierwotnie wyrósł z RCS.
Michael Kohne,
4
Zauważ też, że z CVS, nawet jeśli nie trafisz na błąd i wszystko zostanie zatwierdzone, ktoś z szybszym połączeniem może zaktualizować swoje drzewo źródłowe w połowie zatwierdzenia, pozostawiając je w niespójnym stanie. (I spodziewam się, że znaczniki czasu byłyby tak samo rozłożone, aby próba sprawdzenia drzewa według daty / godziny, która wypadła w środku zatwierdzenia, miałaby podobne wyniki.)
SamB
15

Jest to wyjaśnione np. W Żegnaj CVS. Zostałem przemycony artykuł napisany przez Andy'ego Lestera :

Jeśli spróbuję zatwierdzić w Subversion, ale jeden z plików ma konflikt lub jest nieaktualny, żaden z plików się nie zatwierdza. W CVS masz w połowie zatwierdzony zestaw plików, które musisz naprawić PRAWO TERAZ.

Fakt, że CVS zmusza programistę do natychmiastowego naprawienia scalenia, jest tak nieproduktywny, jak to tylko możliwe. W porównaniu z tym znaczącą zaletą jest opcja opóźnienia / anulowania / ostrożnego scalenia zmian.


Inne zalety SVN w stosunku do CVS wyjaśnione w powyższym artykule to:

  • Lokalne wersje wszystkiego, co robisz
     
    Jeśli chcesz cvs diff, musisz być w stanie połączyć się z repozytorium. Bez połączenia sieciowego, bez różnic. Subversion przechowuje lokalne nieskazitelne kopie tego, nad czym pracujesz, więc svn diff będzie działał dobrze. Chcesz zacząć od nowa? svn revert działa również bez połączenia.

  • Symboliczne nazwy poprawek
     
    HEAD to nazwa wierzchołka tułowia w CVS, ale zawsze chciałem móc powiedzieć „-r-1”, tak jakbym mógł cofnąć się w czasach PVCS. W CVS muszę zrobić cvs zalogować się do tego, co edytuję, a następnie odjąć jedno. To nie jest fajne. Z Subversion mogę powiedzieć svn diff -r PREV.

  • Raportowanie stanu rzeczywistego
     
    W CVS jedynym sposobem, aby sprawdzić, czy coś na serwerze jest nowsze, jest aktualizacja cvs i nadzieja, że ​​cokolwiek się zepsuje, nie spowoduje żadnych konfliktów. Dzięki poleceniu svn status otrzymuję rzeczywisty status, dzięki czemu mogę sprawdzić, czy występują konflikty PRZED dokonaniem aktualizacji.

  • Pomocna obsługa konfliktów scalania
     
    W CVS, jeśli występują konflikty, w pliku pojawiają się znaczniki konfliktu. W Subversion otrzymujesz znaczniki konfliktu, PLUS kopię oryginalnego pliku przedkonfliktowego, PLUS wersję, która spadła z serwera, PLUS wersję, którą pierwotnie edytowałeś. Następnie musisz jawnie svn rozwiązać plik.txt, aby poinformować Subversion, że naprawiłeś problem. Koniec z przypadkowym ponownym włączaniem do CVS ze znacznikami konfliktu.

komar
źródło
8

Oznacza to, że wszystkie zmiany we wszystkich plikach są zatwierdzane w jednej transakcji, więc albo wszystkie zakończą się powodzeniem, albo żadna.

Oznacza to, że rzadziej wprowadzane są częściowe zmiany w repozytorium, co powoduje niepowodzenia kompilacji. Nadal możesz sprawić, że ludzie zapominają o sprawdzeniu wszystkich odpowiednich plików, ale jest to raczej problem procesowy niż problem z systemem kontroli wersji.

jk.
źródło
czy to nie jest dobra rzecz? W przeciwnym razie częściowe zatwierdzenie spowodowałoby brak synchronizacji plików.
Geek
2
tak, to dobrze, częściowe zobowiązania są złe
jk.