Podczas pisania programu zdarza się, że po zmianach program przestaje działać, lub działa gorzej i chcielibyśmy wrócić do poprzedniej wersji, lub przynajmniej zobaczyć jakie zmiany wprowadziliśmy. Oczywiście zachowywać program pod innymi nazwami, ale: a) zgodnie z prawami Murphy'ego, wersja która jest nam potrzebna zwykle jest jedyną, której nie zachowaliśmy oraz b) proces ten jest jednak kłopotliwy i wymaga (nawet jeśli niewiele) to jednak trochę czasu. Oczywiście komputery mają nam życie ułatwiać, więc powstały narzędzia, które tę pracę (i wiele więcej) wykonują za nas. Narzędzia te nazywane są systemami kontroli wersji. Poniżej kilka słów o najprostszym z nich: RCS (Revision Control System)[1].
Uwaga: Opisany poniżej proces jest to wersja najbardziej uproszczona, zakładająca pracę nad plikiem jednego użytkownika na jednym komputerze, prawie cały czas w trybie blokady.
Pierwszym krokiem jest inicjalizacja systemu. Ponieważ RCS jest systemem prostym, taka jest też inicjalizacja: w katalogu, w których chcemy go używać tworzymy katalog RCS
:
mkdir RCS
Komentarz: Tak naprawdę tworzenie katalogu RCS nie jest konieczne, a jeśli tego nie zrobimy pliki będą składowane w katalogu bieżącym z nazwą *,v
.
Aby dodać plik do systemu kontroli wersji należy wykonać polecenie
ci -l plik
a następnie podać opis pliku (czyli co zawiera).
Opis kończymy wpisując znak "." jako jedyny znak w nowej linii.
Komentarz: Dzięki użyciu -l w bieżącym katalogu pozostanie plik w trybie edycji, ale tak naprawdę wystarczy wykonać
ci plik
- patrz: "praca z systemem".
Aby zarejestrować zmiany w pliku wykonujemy
ci -l plik
a następnie podajemy tekst, który pojawi się w historii zmian, podobnie
jak przy pierwszym dodaniu - kończąc samotną kropką w nowej.
Aby wyświetlić zmiany wprowadzone względem ostatnio zarejestrowanej wersji uźywamy
rcsdiff plik
informacje wyświetlone są w formacie programu diff
[4]
rcsdiff -r1.5 plik
Porównuje plik bieżący z wersją 1.5.
rcsdiff -r1.5 -r1.2 plik
Porównuje plik w wersji 1.5 z wersją 1.2
rlog plik
Wyświetla dane wybranego pliku.
rlog RCS/*
Wyświetla dane wszystkich plików.
RCS zakłada, że pracujemy z plikami tekstowymi.
Rozpoczynając pracę nad danym plikiem należy go zarejestrować (ci) podając krótki opis jego zawartości.
Jeśli chcemy rozpocząć pracę nad danym plikiem należy go wyciągnąć z archiwum i zablokować do edycji (co -l). Blokada jest związana z konkretnym użytkownikiem i trwa tak długo, dopóki zmiany nie zostaną zarejestrowane (ci). W czasie trwania blokady nikt nie może wykonać ponownego pobrania do edycji, nikt też, poza użytkownikiem, który założył blokadę, nie może zarejestrować zmian.
Jeśli potrzebujemy wyciągnąć plik z archiwum, ale nie zamierzamy go zmieniać (na przykład jest to plik nagłówkowy o ustalonej zawartości potrzebny do kompilacji pliku źródłowego, nad którym pracujemy), możemy użyć pobrania nieblokującego (co, lub co -u). Plik pobrany z archiwum będzie miał uprawnienia "tylko do odczytu".
Ponieważ zwykła rejestracja (ci bez dodatkowych opcji) powoduje usunięcie wersji bieżącej i przeniesienie zmian do pliku archiwum. Przy pracy najczęściej używa się zatem ci -l, lub ci -u (co jest równoważne wykonaniu ci z następującym po nim co z odpowiednią opcją).
Emacs ma tryb pracy związany z kontrolą wersji w RCS (oraz w innych systemach
kontroli wersji) uruchamiający się automatycznie, gdy w danym katalogu znajduje
się katalog RCS. Polecenia tego trybu dostępne są z menu "Tools->Version Control".
Zdefiniowane są też różne skróty klawiaturowe, przy czym do normalnej pracy
wystarcza znajomość dwóch:
C-x v v - następna "logiczna" czynność, czyli wykonanie ci -u w przypadku
pliku zablokowanego, co -l w przypadku pliku niezablokowanego.
Przy rejestracji zmian otworzy się okno, do którego należy wprowadzić
opis zmian, kończąc C-c C-c. Po zarejestrowaniu zmian plik jest przywrócony
w trybie "tylko do odczytu" (co jest sygnalizowane symbolem %%
w linii
statusowej na lewo od nazwy pliku - by ponownie go edytować, należy go zablokować
wykonując ponownie C-x v v
.
Przydają się też
C-x v l
- opis danego pliku (odpowiednik rlog
)
C-x v h
- Utworzenie listy zmian (ChangeLog
, możliwy do zapisania w pliku)
Numer wersji pliku jest widoczny w linii statusowej po RCS:
.
RCS umożliwia dołączanie automatycznie generowanych napisów do pliku
wybieranego z archiwum.
Służą do tego słowa kluczowe wzięte pomiędzy symbole $$
.
Jeśli, na przykład, chcielibyśmy dołączać do pliku źródłowego
automatycznie historię zmian, wystarczy wpisać do pliku:
/∗
Po zarejestrowaniu zmian i otworzeniu pliku ponownie, napis
∗ $Log$
∗/
$Log$
zostanie
uzupełniony o opisy zmian wprowadzane przy każdej wersji (uwaga - jeśli słowo
kluczowe rozwija się do wielu wierszy, znaki znajdujące się w tej samym wierszu
co słowo kluczowe, jak * na początku, zostaną powtórzone w każdym wygenerowanym
wierszu).
Gdyby program miał się witać informacją o dacie modyfikacji wystarczy dodać
printf("Wersja:$Revision$ z dnia $Date$");
Informację o pozostałych słowach kluczowych można znaleźć pod koniec instrukcji
polecenia co
.
Dokładniejsze instrukcje można uzyskać z manuali (man
) poleceń
ci, co, rcs, rcsclean, rcsdiff, rcsmerge, rlog, rcsfile
.
RCS jest systemem najprostszym, tym samym o najmniejszych możliwościach. Sprawdza się przy małych projektach, z plikami tekstowymi, zmienianymi przez pojedynczego, lub małą grupę użytkowników. W przypadku większych projektów i większej liczby użytkowników używane są bardziej złożone systemy. Obecnie najpopularniejsze to git i svn, inne to mercurial, bazaar, cvs. Istnieją także narzędzia obsługujące różne systemy kontroli wersji w ramach jednego interfejsu. Najpopularniejszym jest tortoise, ale można do nich zaliczyć także tryb kontroli wersji emacsa, czy obsługę w środowiskach eclipse i qt.