Laboratorium 3 - CVS
Czym jest CVS
- CVS (Concurrent Versions System) - narzędzie do zarządzania
kodem źródłowym. CVS wspomaga pracę z kodem źródłowym (ogólnie: dowolnego
rodzaju plikami) gdy nad kodem tym pracuje wielu ludzi jednocześnie.
- Pojęcia repozytorium (repository) i katalogu roboczego
(working directory)
- zmienna środowiskowa CVSROOT
- Polecenie cvs - sposób użycia
cvs [opcje_ogolne] komenda [opcje_komendy] [argumenty_komendy]
- Przykładowe repozytorium dostępne przez www
- Strona domowa CVS
- Następca: Subversion
Podstawowe komendy polecenia cvs
- init - tworzenie repozytorium
cvs -d "$HOME/cvsroot" init
albo
export CVSROOT="$HOME/cvsroot"
cvs init
- import - wprowadzanie istniejacego zbioru plikow do
repozytorium
cvs import bigint balis start
Uwaga! Komenda import wprowadza do repozytorium CVS zawartosc
katalogu biezacego wraz z podkatalogami! Oznacza to, ze gdy chcemy
wprowadzic jakis projekt do repozytorium, trzeba najpierw wejsc do glownego
katalogu tego projektu. Pierwszy parametr komendy import (w tym przykladzie
'bigint') oznacza nazwe modulu w CVS, w ktorym zapisane zostana
zaimportowane pliki (nie jest to nazwa katalogu, ktory nalezy zaimportowac!).
Dwa pozostale argumenty to znaczniki - jako pierwszy mozna wpisac np. swoj
login, jako drugi slowo 'start'.
- checkout (lub: 'co', 'get') - pobranie plikow z repozytorium
cvs checkout bigint
- commit - wpisanie zmian dokonanych w katalogu roboczym do
repozytorium
cvs commit
- add - dodanie nowego pliku do projektu
cvs add bigint.h
- update - uaktualnienie plików w katalogu roboczym
cvs update
cvs update bigint.h
cvs update -r 1.2 bigint.h
cvs update -A -P -d
- release - zakończenie sesji, usunięcie katalogu roboczego
cvs release
Zdalny dostęp do repozytorium CVS
- Metoda pserver
- Przez ssh
- Dygresja: dostep przez ssh przy uzyciu kluczy (bez podawania hasla)
Konflikty
Czasem podczas próby zapisu zmian do repozytorium (cvs commit) wystąpi
konflikt jesli ktoś w miedzyczasie zmodyfikowal ten sam plik. Wtedy zapisanie
zmian nie jest mozliwe. Nalezy najpierw uaktualnic plik (cvs update).
Konflikty zostana albo automatycznie rozwiazane, albo zaznaczone w pliku,
tak aby uzytkownik usunal je recznie. Sekcja, w ktorej wystepuje konflikt
jest w pliku zaznaczona w nastepujacy sposob:
<<<<<<<
wersja lokalna
=======
wersja zdalna
>>>>>>>
Ćwiczenie
Celem ćwiczenia jest współbieżna edycja jednego pliku przez wiele osób
- Serwer: fatcat.ftj.agh.edu.pl
- Ścieżka do repozytorium: /tmp/cvsroot2
- Nazwa modulu: imiona
- Należy pobrać z repozytorium katalog imiona (konieczny zdalny dostep!).
- W katalogu tym jest plik o nazwie `imiona.txt', do którego
należy wpisać swoje imię i nazwisko, a następnie zapisać zmiany
do repozytorium.
- Proszę próbować modyfikować plik i zapisywać go do repozytorium
aż do otrzymania konfliktów.
Wersje plików
- cvs log - historia zmian.
Komenda cvs log
wyświetla historię pliku, tj. informacje o kolejnych wersjach
wraz z komentarzami. Przykład:
cvs log bigint.cpp
- cvs status - status plików
Komedna cvs status wypisuja aktualny status pliku,
tj. jego ostatnią wersję, wersję w katalogu roboczym, etc.
cvs status bigint.cpp
- Użycie opcji -r
- Opcja '-r' służy do podania numeru wersji, np. w połączeniu
z komendą checkout służy do pobrania z repozytorium określonej
wersji pliku (lub całego modułu):
cvs checkout -r tag argumenty
gdzie tag jest numerem wersji. Przykłady użycia:
cvs checkout -r 1.1 bigint/bigint.cpp
cvs checkout -r 1.1 bigint
- Opcji '-r' można też używać z innymi poleceniami, np. update.
Przykład:
cvs update -r 1.3 bigint.cpp
W tym przypadku komenda ta spowoduje uaktualnie wersji pliku
bigint.cpp znajdującego się w bieżącym katalogu do wersji 1.3
(z ewentualnym uwzględnieniem konfliktow, etc.).
Rozgałęzienia (branches)
- Znaczniki (tags)
Plik (lub cały moduł) można oznaczyć specjalnym symbolicznym
znacznikiem. Potem można używać tego znacznika jako oznaczenia
wersji. Do oznaczania plików służą dwie komendy: cvs tag
i cvs rtag.
- Rozgałęzienia
- Załóżmy, że mamy stabilną wersję kodów źródłowych. Chcemy wprowadzać
dalsze (eksperymentalne) modyfikacje, ale nie modyfikować głównego
repozytorium, żeby nie stracić stabilności. Możemy utworzyć gałąź
w repozytorium, w której będziemy rozwijać eksperymentalną wersję projektu,
podczas gdy w głównym jego "pniu" pozostanie stara, stabilna wersja.
- Przykład: po wypuszczeniu wersji 1.2 projektu decydujemy się utworzyć
gałąź z eksperymentalnymi zmianami R1fix. Zarówno główny pień, jak
i ta gałąź są rozwijane równolegle. Co pewien czas wprowadzamy kod
z eksperymentalnej gałęzi do głównego pnia i kontynuujemy rozwój
eksperymentalnego kodu.
+-----+ +-----+ +-----+ +-----+ +-----+
! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 ! <- Główny pień
+-----+ +-----+ +-----+ +-----+ +-----+
! *
! * (merge)
! *
! +---------+ +---------+ +---------+
Gałąź R1fix -> +---! 1.2.2.1 !----! 1.2.2.2 !----! 1.2.2.3 !
+---------+ +---------+ +---------+
- Gałąź tworzymy przy użyciu komendy rtag i opcji '-b', np.:
cvs rtag -b MOJ_TAG bigint
Komenda ta różni się tym od rtag bez opcji '-b', że samo rtag
nadaje tylko symboliczne oznaczenie, zaś z opcją '-b' tworzy fizyczne
rozgałęzienie w repozytorium, na którym można normalnie pracować.
- Scalanie zmian
- W katalogu roboczym mamy pliki z glownego pnia repozytorium. Zeby scalic je ze zmianami
dokonanymi w galezi branch_name, najlepiej zrobic to przy pomocy nastepujacej
sekwencji komend:
(1) cvs tag before_merge
(2) cvs update -j branch_name test.java
(3) cvs rtag -r branch_name branch_name_merged_on_date
(4) cvs commit -m "komentarz"
(5) cvs tag after_merge
(1) - Nadanie znacznika plikom w lokalnym katalogu roboczym przed scaleniem.
(2) - Wprowadzenie zmian z galezi branch_name do katalogu roboczego.
(3) - Nadanie znacznika branch_name_merged_on_date plikom w galezi branch_name
w ich ostatniej wersji (zeby zaznaczyc, ze w tym miejscu galezi bylo ostatnie scalanie zmian).
(4) - Wpisanie zmian do repozytorium - od tego momentu zmiany z galezi sa scalone z glownym
pniem repozytorium.
(5) - Nadanie znacznika plikom w lokalnym katalogu roboczym po scaleniu.
Najwazniejsze jest polecenie (2). Nadawanie znacznikow w (1), (3) i (5) ulatwia pozniejsze
zarzadzanie kodem i galeziami.
- Zeby wprowadzic zmiany po raz kolejny, nalezy scalic zmiany dokonane tylko od czasu
poprzedniego scalenia - zmienia sie polecenie (2):
(1) cvs tag before_merge_on_date
(2) cvs update -j branch_name_merged_on_date -j branch_name
(3) cvs rtag -r branch_name branch_name_merged_on_date
(4) cvs commit -m "komentarz"
(5) cvs tag after_merge_on_date
(2) - Wprowadza zmiany dokonane pomiedzy wersja branch_name_merged_on_date
a wersja branch_name (tj. wersja aktualna) z galezi do plikow w katalogu roboczym.
Zadania
- Proszę utworzyć nowe repozytorium CVS w swoim katalogu domowym (np.
$HOME/cvsroot) i wpisać do niego pliki używane na zajęciach
z Makefile lub Ant.
- Proszę pobrać z repozytorium do katalogu roboczego wpisane w zadaniu 1
pliki, wprowadzić w nich jakieś modyfikacje, wpisać zmiany do repozytorium,
następnie obejrzeć historię zmian.
- Proszę utworzyć nową gałąź dla projektu w repozytorium. Do nowego
katalogu proszę pobrać projekt z tej gałęzi. Proszę wprowadzić zmiany,
następnie wpisać je do repozytorium. Proszę spróbować uaktualnić zmiany
w poprzednim katalogu roboczym, który zawiera pliki z głownego pnia
(a nie rozgałęzienia) i zobaczyć, jaki będzie efekt.
- Prosze scalic zmiany - wprowadzic zmiany z galezi do glownego pnia repozytorium.
Bartosz Baliś, balis at agh.edu.pl
Maciej Malawski, malawski at agh.edu.pl
|