FANDOM


W większych projektach programistycznych, składających się z wielu plików źródłowych, bardzo trudno jest zapamiętać jakie modyfikacje zostały zrobione i przez kogo. Dlatego konieczne staje się korzystanie z narzędzi umożliwiających zarządzanie wersjami programu w wersji źródłowej ( ang. source code control system). W Linuxie standardowo dostępne są dwa systemy zarządzania kodem źródłowym : RCS( ang. Revision Control System) i CVS (ang . Concurrent Version Control System). CVS to potężne narzędzie pozwalające na jednoczesne rozwijanie aplikacji przez wielu programistów. CVS jest bardzo wyrafinowanym systemem, administracja kodem źródłowym wymaga nieco więcej pracy niż zarządzanie kodem źródłowym za pomocą RCS. CVS był opisany w miesięczniku Software 2.0 z maja, dlatego nie będę go tutaj opisywał, a wszystkich zainteresowanych odsyłam do tego artykułu. CVS do zarządzania wersjami źródłowymi programów używa systemu RCS. RCS to system składający się z zestawu narzędzi, umożliwiający zarządzanie wersjami źródłowymi programów. Zarządzanie wersjami źródłowymi programów polega na zapisywaniu wersji kodu źródłowego tak, aby w razie potrzeby móc tą wersję odzyskać. Gdy jeszcze nie znałem narzędzi takich jak RCS i CVS robiłem to w oparciu o następującą procedurę:

  1. Kiedy miałem pierwszą wersję programu, archiwizowałem ją za pomocą programu tar i zapisywałem ją jako wersję numer 1.
  2. Gdy chciałem dokonać jakiś zmian rozpakowywałem archiwum do katalogu roboczego, robiłem zamierzone zmiany, testowałem program i ponownie archiwizowałem kod źródłowy za pomocą programu tar i zapisywałem jako wersję numer 1.0.1.
  3. Kiedy znowu potrzebowałem wprowadzić zmiany do kodu źródłowego rozpakowywałem ostatnio zapisaną wersję i na niej pracowałem.

Oprócz tego musiałem gdzieś zapisywać zmiany dokonywane w każdym z plików źródłowych. Ponadto moje archiwa zajmowały sporo miejsca.

RCS pozwala zautomatyzować ten proces, ponadto posiada wiele funkcji. Niektóre z nich krótko przedstawię:

  • RCS zapisuje i przechowuje różne wersje kodu źródłowego. Wszelkie zmiany nie powodują zmian w poprzedniej wersji. Dowolną wersję plików źródłowych możesz bardzo szybko odzyskać. Do identyfikacji wersji, którą chcesz pobrać z archiwum możesz posłużyć się numerem tej wersji, datą lub autorem.
  • RCS zapisuje automatycznie zmiany dokonane w plikach źródłowych, oprócz tego przechowuje datę i autora dokonanych zmian.
  • RCS nie pozwala na jednoczesne dokonywanie zmian w tym samym pliku przez kilku programistów.
  • Kolejne wersje plików źródłowych są przechowywane w bardzo efektywny sposób, oszczędzający miejsce na dysku. RCS przechowuje tylko zmiany dokonane w plikach źródłowych.

Załóżmy, że właśnie napisałeś aplikację składającą się z trzech plików źródłowych ( foo.cpp, foo.h i main.cpp) i chcesz do zarządzania wersjami źródłowymi tej aplikacji użyć RCS. Przypuśćmy, że pliki te są przechowywane w katalogu '/home/daro/zrodla'. Zanim przejdziemy do konkretnego przykładu pokazującego krok po kroku jak korzystać z RCS, musimy omówić znaczniki z których korzysta RCS. RCS może umieścić określone informacje zarówno w plikach źródłowych i obiektowych. Aby móc umieścić te informacje w naszych plikach musimy umieścić znaczniki w naszych plikach źródłowych. Znaczniki RCS mają postać:

$...$

Podczas operacji przeprowadzanych przez RCS, każdy z znaczników jest zamieniany na konkretne informacje. Jeżeli umieścimy w pliku źródłowym znacznik $Id$ to RCS rozwinie go do postaci :

nazwa_pliku wersja data czas_zmian autor_zmian

Znaczniki możemy umieścić w pliku źródłowym w ten sposób:

 /*
$Id$
*/

a RCS rozwinie go do postaci:

$Id: foo.cpp,v 1.1 2001/05/29 13:06:45 daro Exp $

Znaczniki RCS możesz również umieszczać w plikach obiektowych. Poniższa linia kodu w C demonstruje jak umieścić znacznik $Id$ w kodzie obiektowym:

static char rcsid[]="$Id$";

Aby w każdym z Twoich plików źródłowych była przechowywana historia zmian dokonana w nich musisz umieścić w nim znacznik $Log$. Tabela 1 opisuje znaczniki wykorzystywane przez RCS.

Tabela 1. Znaczniki używane przez RCS.

<tbody> </tbody>
Znacznik Opis
$Author$ Nazwa użytkownika, który zarejestrował wersję
$Date$ Data i godzina zarejestrowanej wersji
$Header$ Informacje
               podsumowujące : nazwa pliku wraz ze ścieżką,
numer wersji, data, autor i stan pliku.
$Id$ Te same informacje
               co $Header$
               z tym, że zamiast pełnej ścieżki do pliku
występuje nazwa pliku.
$Locker$ Nazwa użytkownika, który zablokował plik
$Log$ Historia zmian wprowadzonych w pliku
$RCSfile$ Nazwa pliku bez nazwy katalogu
$Revision$ Numer wersji
$Source$ Pełna ścieżka do pliku.
$State$ Stan pliku określony przez opcję -s polecenia rcs lub ci

Aby poddać pliki naszej przykładowej aplikacji kontroli RCS wykonaj następujące kroki:

  • przejdź do katalogu ze źródłami:
    cd /home/daro/zrodla
    
  • w katalogu z plikami źródłowymi utwórz katalog 'RCS':
    mkdir RCS
  • wywołaj polecenie ci dla każdego pliku:
    ci foo.cpp
    ci foo.h
    ci main.cpp
    


Polecenie ci to skrót od angielskiego słowa check-in. Polecenie ci tworzy plik w katalogu RCS i przechowuje plik pod numerem wersji 1.1. Nazwa pliku jest identyczna z plikiem oryginalnym z dodatkiem ?,v? na końcu. Plik 'foo.cpp' będzie nosił nazwę 'foo.cpp,v'. Polecenie usuwa plik źródłowy i prosi Cię o wpisanie opisu pliku ( powinien to być opis zawartości pliku). Późniejsze polecenia 'ci' będą prosiły o wpisanie zmian dokonanych w pliku.

Pliki w katalogu RCS są nazywane plikami RCS, wszelkie pozostałe pliki to pliki robocze. Załóżmy, że zaszła potrzeba zmodyfikowania pliku 'foo.cpp'. Potrzebny Ci będzie plik foo.cpp oraz wszelkie pozostałe pliki, dlatego, że chcesz przetestować wprowadzone zmiany. Aby odzyskać z archiwum pliki foo.h i main.cpp wydaj polecenie:

co foo.h
co main.cpp

Polecenie co (ang. check-out) wydobywa pliki z archiwum w trybie tylko do odczytu. Nie chcemy dokonywać żadnych zmian w tych plikach dlatego odzyskujemy je w trybie tylko do odczytu. Aby móc edytować plik 'foo.cpp' musimy go wydobyć z RCS za pomocą polecenia 'co' z opcją '-l':

co -l foo.cpp

Opcja l oznacza, że plik zostanie zablokowany. Nikt inny nie będzie mógł zmodyfikować tego pliku do czasu ponownego zarejestrowania pliku źródłowego. Blokada pliku gwarantuje, że nikt oprócz ciebie nie będzie mógł dokonać zmian w pliku. Plik będzie można wyrejestrować z archiwum, ale w trybie tylko do odczytu.

Po dokonaniu zmian i przetestowaniu programu plik umieszczamy w archiwum ponownie za pomocą polecenia ci:

ci foo.cpp

Polecenie to usunie plik z katalogu roboczego i poprosi Cię o wprowadzenia opisu zmian jakich dokonałeś w pliku foo.cpp.

Jeśli nie chcesz, aby plik był usuwany z katalogu roboczego do polecenia ci dodaj opcję '-l':

 ci -l foo.cpp

lub '-u'

 ci -u foo.cpp

Opcja '-l' jest użyteczna jeśli wciąż chcesz być w stanie edytować plik. Jeśli chcesz, aby plik pozostał, ale tylko w trybie do odczytu skorzystaj z opcji '-u'.

Tabela 2. Polecenia systemu RCS.</p>

<tbody> </tbody>
Polecenie Opis
ci Tworzy nową wersję pliku i dodaje plik roboczy do archiwum
co Pobiera roboczą
               wersję pliku w trybie do odczytu ( polecenie
               wywołane z opcją '-l' pobiera roboczą wersję
               pliku w trybie do edycji i blokuje plik w
archiwum)
ident Wyszukuje znaczniki w pliku
merge Ujednolica zmiany
               wprowadzone w dwóch plikach i zapisuje je w
trzecim
rcsdiff Porównuje plik roboczy z plikiem RCS
rcsmerge Ujednolica różne wersje plików
rlog Wyświetla historię zmian dokonanych w pliku.


Polecenie 'merge'.

Bardzo często zdarza się, że nad jednym plikiem w tym samym czasie pracują dwie osoby i zachodzi potrzeba ujednolicenia zmian. Z pomocą przychodzi nam tutaj polecenie merge. Składnia tego polecenia ma postać:

merge [opcje] plik1 plik2 plik3


Załóżmy, że mamy plik oryginalny foo.cpp oraz dwa pliki ze zmianami foo_darek.cpp ( to są zmiany wprowadzone do pliku foo.cpp przez Darka) oraz foo_ola.cpp (to jest plik foo.cpp ze zmianami wprowadzonymi przez Olę). Aby plik foo_darek.cpp zawierał zmiany wprowadzone przez Olę i przez Darka wydajemy polecenie:

merge foo_darek.cpp foo.cpp foo_ola.cpp


Może się zdarzyć, że zmiany w pliku foo.cpp zostały wprowadzone zarówno przez Olę i Darka w tych samych liniach. Wówczas polecenie merge zaznaczy linie w sposób pokazany na listingu 1.

 --------------------------------------------------------------------------------
<<<<<<< foo_darek.cpp

cout<<"Zmiana wprowadzona przez
Darka"<<endl;



=======


cout<<"Zmiana wprowadzona przez Olę
"<<endl;




>>>>>>> foo_ola.cpp 
        --------------------------------------------------------------------------------

Co jest określane jako konflikt. Konflikty powinny być usunięte ręcznie przez programistę.


Przypuśćmy, że zapomniałeś jakie zmiany wprowadziłeś do pliku roboczego. W takiej sytuacji może pomóc Ci polecenie rcsdiff. Polecenie to wyszukuje różnice między plikiem roboczym i plikiem RCS. Znalezione zmiany wyświetla na ekranie:

rcsdiff foo.cpp


Możemy temu poleceniu nakazać wyświetlenie różnić między dwoma wersjami plików:

rcsdiff -r1.1. -r1.3 foo.cpp

Czasem okazuje się, że dokonałeś zmian które okazują się błędne lub wynikają z niewłaściwego rozumowania . Wówczas możesz te zmiany odrzucić. Możesz to zrobić poprzez nadpisanie bieżącego pliku roboczego kopią pliku z archiwum. Wywołujemy wówczas polecenie 'co' z opcjami '-u' i '-f':

co -f -u foo.cpp

Opcja '-u' odblokowuje wydobytą wersję pliku, a -f zmusza RCS do nadpisania pliku roboczego plikiem RCS.

Jeśli w którymś z Twoich plików źródłowych lub obiektowych znajduje się znacznik RCS możesz go odszukać za pomocą polecenia 'ident'. Jeśli znacznik RCS będzie umieszczony w pliku obiektowym (tak jak to pokazałem na początku tego artykułu) wówczas dzięki poleceniu ident będziemy mogli określić jakie wersje plików źródłowych zostały użyte do zbudowania obecnej wersji programu. Aby zobaczyć jakie znaczniki RCS zostały użyte w pliku foo.cpp wydajemy polecenie:

ident foo.cpp

W powyższym artykule nie przedstawiłem wszystkich możliwości jakie oferuje RCS, tym niemniej po przeczytaniu tego artykułu powinieneś umieć korzystać z RCS w stopniu podstawowym. Jeśli pragniesz zgłębić swoją wiedzę na temat RCS ( w szczególności opcji poszczególnych poleceń ) odsyłam Cię do podręcznika man.

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.

Więcej z Fandomu

Losowa wiki