CVS - podstawy Koło Naukowe Systemów Open Source Wyzsza Szkoła Biznesu - National-Louis University Krzysztof Walo kwalo@wsb-nlu.edu.pl
Czym jest CVS? CVS to system kontroli wersji. Służy do zapisywania i przechowywania zmian w plikach źródłowych. Umożliwia wielu programistom pracę nad jednym projektem. Zapewnia dostęp do źródeł w dowolnej wersji. Synopsis: I\YAI\YUVZOUTYCIUSSGTJAIUSSGTJUVZOUTYCAIUSSGTJGXMYC cvs options - Opcje globalne. Mają wpływ na wszystkie komendy command - Komenda. Ma główny wpływ na zachowanie programu command options - Opcje dla danej komendy command args - Argumenty - najczęściej jest to plik (katalog), lista plików, albo moduł Pomoc - Pomoc na temat opcji globalnych I\YNKRVUVZOUTY - Lista wszystkich komend I\YNKRVIUSSGTJY - Opcje pojedynczej komendy I\Y.IUSSGTJ Pobieranie źródła CVS w przeciwieństwie do innych systemów kontroli wersji, nie blokuje tych plików, które są poddawane edycji. Ściąga za to źródła w odpowiedniej wersji z repozytorium do katalogu roboczego. Komenda: I\YJA SKZUJG CYIOK QGJUXKVU _ZUXO[SINKIQU[ZSUJ[R Pobiera źródła w najnowszej wersji z gałęzi głównej. Metoda określa sposób dostępu do repozytorium. Główne metody dostępu: * :local: - dostęp do zasobów lokalnych * :ext: - zasoby zewnętrzne * :server: - jak wyżej
* :pserver: - dostęp chroniony hasłem Moduł to jakiś katalog ze źródłami, znajdujący się w repozytorium. Ścieżkę do repozytorium można zapisać w zmiennej środowiskowej CVSROOT: K^VUXZ)<9855:#YIOK QGJUXKVU _ZUXO[S I\YINKIQU[ZSUJ[R Usuwanie źródeł Komenda: I\YXKRKGYKJQGZGRUM Usuwa źródła i sprawdza, czy wszystkie pliki są zatwierdzone. Zatwierdzanie plików zastępuje w pewnym sensie blokowanie w innych systemach kontroli wersji. Tworzenie nowego repozytorium Repozytoria to miejsca, gdzie cvs przechowuje pliki historii, oraz inne pliki konfiguracyje. Stąd są pobierane źródła w odpowiedniej wersji do katalogu roboczego. Repozytorium powinno być dostępne (lokalnie, lub przez jakieś połączenie) z wszystkich miejsc, które chcą z niego kożystać. Ilość miejsca na dysku powinna być trzykrotnie większa niż szacowany rozmiar projektu. Repozytorium tworzy się komendą: I\YJ[YXRUIGRI\YXUUZOTOZ Opcja '-d' możne być zastąpiona zmienną środowiskową CVSROOT. W katalogu CVSROOT, w repozytorium znajdują się różne pliki konfiguracyjne. W pozostałych katalogach, są pliki historii. Pliki historii są zakończone ',v'. Tam są przechowywane wszystkie informacje o zmianach, jakie były przeprowadzone.
Dodawanie projektu do repozytorium Przykładowo, jeśli mamy źródła w katalogu ~/myproj i chcemy je dodać do repozytorium cvs, wykonujemy nast. komendy: IJdS_VXUP I\YJ[YXRUIGRI\YXUUZOSVUXZVXUPKQZ_S_VXUPS_VXUPYZGXZ Cvs otworzy edytor teksu, aby wpisać wiadomość do historii. Edytor można zdefiniować w zmiennej środowiskowej EDITOR, jeśli zmienna nie jest zainicjowana, zostanie użyty vi. Zamiast otwierać edytor, można podać wiadomość po opcji '-m', np. I\YJ[YXRUIGRI\YXUUZOSVUXZS/SVUXZS_VXUPVXUPKQZ_S_VXUPS_VXUPYZGXZ Kolejne argumenty 'projekty/myproj' to nazwa modułu, myproj i start to odpowiednio: główny tag (vendor tag) i tag wydania (release tag). Zatwierdzanie zmian W przeciwieństwie do większości systemów kontroli wersji, CVS nie tworzy blokad na plikach, które podlegają edycji, tylko tworzy kopie robocze, na których developerzy pracują niezależnie. Po skończonej pracy, zmiany należy zatwierdzać. Do zatwierdzania zmian, służy polecenie: I\YIUSSOZS1USKTZGX VROQ Jesli nie użyje się opcji -m, cvs otworzy edytor, aby wpisać komentarz do wprowadzonych zmian. Edytor możemy wybrać, ustawiając zmienną środowiskową EDITOR. Jeżeli wielu programistów pracuje nad jednym plikiem, może zajść sytuacja, kiedy będziemy próbowali zatwierdzić plik, który został zmodyfikowany przez kogoś innego. Należy wtedy przywrócić plik do najnowszej wersji (np. komendą update), nałożyć swoje zmiany i ponownie próbować zatwierdzić. Jeśli nie mamy praw zapisu w repozytorium, możemy wysłać developerowi wynik polecenia: I\YJOLLVROQ Polecenie to wyświetla na ekran różnice między lokalnie zmodyfikowanym, a ostatnio zatwierdzonym plikiem. Zmiany te można dodać do pliku za pomocą polecenia patch.
Dodawanie/usuwanie plików Do dodawania/usuwania plików do/z repozytorium służą komendy: I\YGJJ I\YXKSU\K Dodawanie: Zanim dodamy jakiś plik musimy go stworzyć w katalogu roboczym: ZU[INVROQ I\YGJJVROQ I\YIUSSOZVROQ @GZ]OKXJ GS_ SOGT_ Usuwanie: XSVROQ I\YXKSU\KVROQ I\YIUSSOZVROQ Katalogów w cvs nigdy nie usuwamy!!! Spowodowałoby to, że nie możnaby odzyskać źródeł sprzed usunięcia katalogu! Zamiast tego usuwamy/przenosimy wszystkie pliki z katalogu, który chcemy 'usunąć'. Podczas pobierania źródeł do komend update, albo checkout dodajemy opcję -P. I\Y[VJGZK6 Dzięki temu cvs nie pobierze pustych katalogów. Jeśli chcemy pobierać puste katalogi z opcją -P, można w nich utworzyć ukryte pliki, np. ZU[INV[YZ_EQGZGRUM GINU]GPESTOK I\YIUSSOZV[YZ_EQGZGRUM GINU]GPESTOK Tagi Tagi służą do nadawania nazw zatwierdzonym plikom. Dzięki nim można mieć dostęp do poprzednich wersji plików, tworzyć gałęzie, itp. Rozróżniamy następujące rodzaje tagów: * Rewizje - każdy plik otrzymuje numer rewizji, wzrasta on za każdym razem, kiedy zatwierdzamy plik. Numer jest przydzielany automatycznie * symboliczne tagi - nadają nazwy odpowiednim numerom rewizji * tagi gałęzi - nazwy nadawane gałęziom projektu
Rewizje Rewizje to numery, które identyfikują wersję pliku. Numery rewizji mają zawsze nieparzystą ilość kropek. Przykładowe numer rewizji: Za każdym razem kiedy zatwierdzamy jakiś plik, ostatnia liczba w numerze rewizji jest zwiększana o 1. Rewizje, które mają więcej niż jedną kropkę, reprezentują pliki w gałęziach. Przypisywanie numerów rewizji: Z reguły nie ma potrzeby zmieniać numerów rewizji. Jest to jednak możliwe. Jeżeli np. mamy program, który doczekał się wersji 2.0, możemy przypisać wszystkim plikom numer rewizji 2.0. Wydajemy komendę w katalogu roboczym: I\YIUSSOZX Przydzielanie tagów Plikom o odpowiednim numerze rewizji, można nadawać symboliczne nazwy - tagi. Nazwy tagów nie mogą się składać z białych znaków. Do przydzielania tagów plikom o numerach rewizji aktulanie znajdującym się w repozytorium służą komendy: I\YZGMTG ]GZGM[VROQ I\YXZGMTG ]GZGM[SUJ[R Komenda 'rtag' operuje wyłącznie na modułach, a 'tag' na plikach. Tagi można przydzielać także innym wersjom plików, np. I\YZGMXVOKX]Y _VROQ Przydziela tag 'pierwszy' plikowi 'plik' o numerze rewizji '1.1'. Jeśli projekt posiada numery wydania, każde wydanie powinno mieć swój tag. Tagi dla wydania powinny mieć specjalne nazewnictwo, np. nazwa i numer wydania oddzielony znakiem minus, zamiast kropki. Przydzielenie tagów dla wersji: I\YXZGMXKRS_VXUP
Przeglądanie, wybieranie tagów Przeglądanie: I\YYZGZ[Y\VROQ Wyświetla wszystkie tagi, jakie zostały przypisane do pliku. Wybieranie: Wiedząc jakie plik ma przypisane tagi, można ściągnąć projekt w odpowiedniej wersji: I\YINKIQU[ZXZGMVROQ Np. jeśli chcemy zobaczyć projekt w wersji 1.0, możemy użyć polecenia: I\YINKIQU[ZXXKRSUJ[R Usuwanie, przenoszenie, zmienianie nazw tagów Zwykle nie należy modyfikować nazw tagów. Służą one do wydobywania informacji z poprzednich wersji plików. Jedyne dopuszczalne przypadki, to kiedy się popełni błąd przy nadawaniu nazwy. Usuwanie: Przenoszenie: I\YZGMJZGMVROQ I\YZGMX,YZGHRKVROQ Przenosi tag 'stable' z pliku o numerze rewizji 1.4 na aktualnie używany plik. Zmienianie nazwy: Zmiana nazwy polega na przeniesieniu starej nazwy na nową i usunięciu starej nazwy. I\YZGMXYZGX_,TU]_VROQ I\YZGMJYZGX_VROQ
Sticky tags Sticky tags występują, kiedy używamy opcji -r przy komendach checkout, lub update. Zwykle odpowiadają gałęzi, albo uniemożliwiają modyfikację jakiegoś pliku/katalogu. Sprawdzanie, czy występują: I\YYZGZ[YVROQ Usunięcie 'sticky tags': I\Y[VJGZK Jeśli chcemy pobrać plik w odpowiedniej wersji, ale bez przypisywania 'sticky tag': I\Y[VJGZKVXZGMVROQ$VROQ Opcja '-p' wypisuje zawartosc pliku na standardowe wyjście. Za pomocą operatora przekierowania '>' wynik polecenia cvs wstawiany jest do pliku 'plik'. Gałęzie i scalanie Gałęzie służą do tworzenia osobnej częsci projektu. Zmiany nanoszone w gałęzi nie mają wpływu na zmiany w gałęzi głównej. Gałęzie tworzymy komendą: I\YZGMHTG ]GMGRK OVROQ Gałąź możemy scalić z główną gałęzią projektu. Scalanie polega na wprowadzeniu zmian między miejscem rozdzielenia, a ostanio zmodyfikowanym plikiem gałęzi do gałęzi głównej. Scalanie do gałęzi głównej: I\Y[VJGZKPTG ]GMGRK OVROQ Dobrze jest oznaczyć miejsce scalenia tagiem: I\YZGMUYZGZTOKYIGRKTOKVROQ W ten sposób przy ponownym scalaniu, można się posłużyć tym tagiem do określenia miejsca, względem którego będziemy scalać: I\Y[VJGZKPUYZGZTOKYIGRKTOKPMGRG VROQ
Numey gałęzi Numery gałęzi są podobne do numerów rewizji. Składają się z liczb oddzielonych parzystą liczbą kropek. Numery rewizji plików, znajdujących się w gałęzi mają dołączoną po kropce liczbę. Np. gałąź o numerze 1.2.4 może mieć pliki o numerach rewizji 1.2.4.1, 1.2.4.2, itd. Pliki znajdujące się w gałęzi oznaczonej tym samym tagiem mają różne numery gałęzi.