[WikiDyd] [TitleIndex] [WordIndex

System kontroli wersji

System kontroli wersji to program służący do kontrolowania zmian kodu (w zasadzie źródłowego), zwłaszcza wtedy, gdy nad projektem pracuje wiele osób, w tym samym czasie. SKW przechowuje informacje o tym kto, kiedy i jakie zmiany w projekcie wykonał i pozwala odtworzyć starsze wersje kodu, porównywać poszczególne wersje między sobą, tworzyć odgałęzienia projektu, itp, itd.

SKW może być oparty o centralne repozytorium (archiwum wersji) lub być zbudowany jako system rozproszony. Przykładami systemów zcentralizowanych są cvs i Subersion. GNU arch to system rozproszony.

cvs

[http://www.nongnu.org/cvs/ Strona domowa cvs]

CVS (ang. concurent version system) to jeden z popularnych (może najbardziej popularny), ale nie jedyny system kontroli wersji oprogramowania. Jest częścią projektu [http://pl.wikipedia.org/wiki/GNU GNU].

Zaczątkiem CVS były skrypty opracowane w 1986 roku przez Dicka Grune. Algorytmy rozwiązywania konfliktów w obecnej wersji CVS pochodzą właśnie z tych skryptów, ale początek samego systemu to rok 1989, kiedy to napisał go Brian Berlinger, wspomagany potem przez Jeffa Polka.

CVS składa się z serwera, zarządzającego centralnym repozytorium i klientów, którzy kontaktują się z serwerem i pobierają lub wkładają pliki do repozytorium. Repozytorium to drzewo katalogów, zawierające pliki zarządzane przez CVS i pewne dodatkowe pliki, zawierające informacje o wersjach, zmianach, itp.

CVS przechowuje informacje o zmianach w plikach (a nie o pojedynczych zmianach).

Przykładowa sesja pracy z CVS wygląda mniej-więcej tak:

Pobranie z repozytorium kodu projektu

$cvs checkout dirdu

Polecenie spowoduje utworzenie katalogu dirdu (w bieżącej lokalizacji) i skopiowanie do niego plików źródłowych.

$ cd didru
$ ls
container.c  CVS/    makefile  output.h  t1_container.c  test1.dat  utils.h
container.h  main.c  output.c  reader.h  t2_container.c  utils.c

Katalog CVS zawiera wewnętrzne informacje CVS-a i raczej nie powinien być modyfikowany (a tym bardziej usuwany).

Edycja kodu Załóżmy, że chcemy poprawić plik reader.h i dodać nowy plik reader.c

$ vi reader.h
$ vi reader.c

Uaktualnienie repozytorium Najpierw zgłaszamy poprawki w pliku reader.h:

$ cvs commit reader.h

Klient cvs-a uruchomi edytor (taki, jak określonow w zmiennej srodowiskowej $CVSEDITOR) i pozwoli opisać zmiany wprowadzone w pliku reader.h (w dodatkowym pliku). Po zamknięciu edytora nowa wersja pliku reader.h zostanie dodana do repozytorium i udostępniona innym osobom pracującym nad projektem. Będą też one mogły obejrzeć opis dodawanych przez nas zmian. Serwer cvs-a może być tak skonfigurowany, że pewne grono osób zostanie poinformowanych e-mailem o naszych zmianiach.

Teraz dodajemy nowy plik - reader.c:

$ cvs add reader.c
cvs add: scheduling file `reader.c' for addition
cvs add: use `cvs commit' to add this file permanently
$  cvs ci
cvs commit: Examining .
/var/lib/cvs/jimp2/dirdu/reader.c,v  <--  reader.c
initial revision: 1.1

(ci to skrótowa wersja komendy commit). Podobnie jak przy poprawkach, także zgłoszenie nowego pliku powoduje wywołanie edytora w celu opisania zmian. Jeśli chcemy tego uniknąć, to można podać opis od razu przy wykonaniu polecenia commit:

$ cvs ci -m "Poprawiony opis prototypu funkcji read_directory" reader.h

Posprzątanie lokalnego katalogu

$ cd ..
$ cvs release -d dirdu
M output.c
You have [1] altered files in this repository.
Are you sure you want to release (and delete) directory `dirdu': n
** `release' aborted by user choice.

Jak widać zapomnieliśmy jeszcze o poprawkach, które zostały dokonane w pliku output.c. Na szczęście klient cvs-a sprawdza takie rzeczy i daje nam możliwość poprawienia tego błędu. Ponieważ nie pamiętamy, jak został zmodyfikowany plik output.c, to przed zrobieniem opisu zmian chcemy porównać aktualna zawartośc tego pliku z tym, co jest zapisane w repozytorium:

$ cd dirdu
$ cvs diff output.c

W efekcie zobaczymy wynik działania programu diff porównującego oba pliki.

Decydujemy się zapisać poprawiony plik:

$ cvs ci -m "Poprawiono funkcję output, aby nie wypisywała <niby-grup>, ktore mają tylko jeden element" output.c
/var/lib/cvs/jimp2/dirdu/output.c,v  <--  output.c
new revision: 1.2; previous revision: 1.1
$ cd ..
$ cvs release -d dirdu
You have [0] altered files in this repository.
Are you sure you want to release (and delete) directory `dirdu': y

Katalog dirdu został skasowany.

Najczęściej używamy dwóch poleceń cvs-a:

$ cvs co projekt

które pobiera cały projekt do naszej ,,piaskownicy";

$ cvs ci 

które uaktualnia repozytorium wynikami naszej pracy.

Jeżeli nad projektem pracuje kilka osób, to w trakcie pracy nad kodem w ,,piaskownicy" możemy użyć polecenia

$cvs update

które uaktualnia zawartość ,,piaskownicy" o zmiany dokonane w repozytorium przez innych.

Inne ważniejsze komendy

Uwaga! poniżej ominięto opcje wspólne cvs-a - właściwie każda komenda ma postać:

$ cvs [opcje-cvs-a] komenda [opcje-komendy] parametry

Lista:

$ cvs upd [opcje] pliki...
$ cvs rem [opcje] pliki...
$ cvs log [opcje] pliki...
$ cvs import [opcje] repozytorium producent wersja
$ cvs hist [opcje] pliki...
$ cvs status [opcje] pliki...
$ cvs tag [opcje] etykieta pliki... 

(Zostaną dokładniej opisane później ;-)

Gdzie jest repozytorium ?

cvs -d /var/lib/cvsroot checkout jimp2/dirdu

setenv CVSROOT /var/lib/cvsroot

export CVSROOT=:ext:max.iem.pw.edu.pl:/var/lib/cvs

Jak wygląda repozytorium?

/usr
 |
 +--local
 |   |
 |   +--cvs
 |   |    |
 |   |    +--CVSROOT
          |      (administrativia)
          |
          +--jstar
          |   |
          |   +--esfem
          |   |   (projekt EsFEM)
          |   |
          |   +--fat
          |   |   (projekt FAT)
          |   |
          |   +--pltr
          |   |   (projekt pltr)
          |   |
          |   +--phd
          |   |   (doktorat)
          |   |
          |   +--rehab
          |   |    (habilitacja)
          |   ...
          |
          +--zespol
          |   |
          |   |
          |   +--2005
          |   |    (publikacje zespołowe w r. 2005)
          |   ...
          ...

Pliki źródłowe są przechowywane w postaci plików o nazwach typu output.h,v Mieści się w nich nie tylko kod źródłowy, ale także zmiany i opisy zmian w postaci dogodnej dla programu diff, uzywanego do aplikowania łat (patch).

Subversion

[http://subversion.tigris.org/ Strona domowa Subversion]

Subversion to poprawiony cvs. Wersja 1.0, wypuszczona w lutym 2004 roku jest właściwie reimplementacją CVSa, w której starano się usunąć główne wady (problemy ze zmienianiem nazw plików, niewygodne zarządzanie odgałęzieniami kodu).

W trakcie tworzenia.

GNU arch

[http://www.gnu.org/software/gnu-arch/ Strona domowa GNU arch]

Filozofia GNU arch jest zupełnie odmienna - jest to program zdecentralizowany. Cała ,,inteligencja" GNU arch-a jest zaszyta w programach-klientach, a jako repozytorium używa się współdzielonego katalogu, lub serwera sftp.

W trakcie tworzenia.


c.d.n.


2015-09-23 06:44