System kontroli wersji - RCS

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].

Niezbędne minimum

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.

Przygotowanie do pracy

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.

Dodanie pliku (initial revision)

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".

Zapisanie nowej wersji

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.

Porównanie pliku z poprzednimi wersjami

Aby wyświetlić zmiany wprowadzone względem ostatnio zarejestrowanej wersji uźywamy
rcsdiff plik
informacje wyświetlone są w formacie programu diff [4]

Porównanie pliku z konkretną wersją

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

Wyświetlanie informacji

rlog plik
Wyświetla dane wybranego pliku.

rlog RCS/*
Wyświetla dane wszystkich plików.

Praca z systemem

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ą).

Dodatkowe informacje

Emacs

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:.

Automatyczne napisy

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:
/∗
∗ $Log$
∗/
Po zarejestrowaniu zmian i otworzeniu pliku ponownie, napis $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.

Instrukcje

Dokładniejsze instrukcje można uzyskać z manuali (man) poleceń
ci, co, rcs, rcsclean, rcsdiff, rcsmerge, rlog, rcsfile.

Słownik

Materiały

  1. http://en.wikipedia.org/wiki/Revision_Control_System
  2. mini HowTo http://www.tldp.org/HOWTO/pdf/RCS.pdf
  3. http://linux.die.net/man/1/rcsintro
  4. man diff

Inne systemy

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.