+++
title = 'CVS: Concurrent Versions System (\...)'
date = '1999-10-01T00:00:00Z'
description = ''
author = 'Παπαδογιαννάκης Βαγγέλης για το Magaz ( magaz.hellug.gr(http://magaz.hellug.gr) )'
issue = ['Magaz 19']
issue_weight = 3
+++

----------------------------------------------------------------------------------------------------------------------------------------------------------------

*Το CVS (Concurrent Versions System) είναι ένα σύστημα που έχει αναπτυχθεί από προγραμματιστές για προγραμματιστές. Δηλαδή, θα μου πείτε; Ε, λοιπόν, είναι
φτιαγμένο για \`\`προγραμματιστικούς\'\' σκοπούς. Ας δούμε όμως αναλυτικά τι κάνει, πώς λειτουργεί, και πώς μπορεί να μας φανεί χρήσιμο.*

----------------------------------------------------------------------------------------------------------------------------------------------------------------

**1. ΕΙΣΑΓΩΓΗ**
-------------------------------------

-   [1.1 ΤΙ ΚΑΝΕΙ ΤΟ CVS](#ss1.1)
-   [1.2 ΠΩΣ ΛΕΙΤΟΥΡΓΕΙ ΤΟ CVS.](#ss1.2)

**2. ΣΤΗΣΙΜΟ CVS ΣΤΟΝ ΥΠΟΛΟΓΙΣΤΗ ΣΑΣ**
------------------------------------------------------------

-   [2.1 LOGIN ΚΑΙ ΕΡΓΑΣΙΑ ΣΕ ΕΝΑ CVS SERVER](#ss2.1)
-   [2.2 ΑΝΑΝΕΩΣΗ ΤΟΥ ΚΩΔΙΚΑ](#ss2.2)

**3. CVS FOR DEVELOPERS**
-----------------------------------------------

-   [3.1 Αλλαγές στον κώδικα και πώς να τις ενσωματώσουμε στο Repository του Project.](#ss3.1)
-   [3.2 CONFLICTS](#ss3.2)
-   [3.3 ΠΑΡΑΚΟΛΟΥΘΗΣΗ ΑΛΛΑΓΩΝ](#ss3.3)
-   [3.4 ΠΡΟΣΘΕΣΗ - ΑΦΑΙΡΕΣΗ ΑΡΧΕΙΩΝ](#ss3.4)

**4. ΕΠΙΛΟΓΟΣ**
-------------------------------------


### [1. ΕΙΣΑΓΩΓΗ]{#s1}

### [1.1 ΤΙ ΚΑΝΕΙ ΤΟ CVS]{#ss1.1}

Το cvs θα λέγαμε ότι χρησιμοποιείται για την διατήρηση και ανάπτυξη ενός προγραμματιστικού έργου (module) μεγάλης εμβέλειας, όπου πολλοί προγραμματιστές μπορούν
να εργάζονται ταυτόχρονα - ή σχεδόν ταυτόχρονα όπως θα δούμε και παρακάτω - για την ολοκλήρωση του. Διατηρεί μια δομή με αρχεία, καταλόγους αρχείων και κώδικα
που είναι προσπελάσιμα από κάθε προγραμματιστή που έχει τη διάθεση να συνεισφέρει. Φυσικά, ο καθένας μπορεί να κάνει αλλαγές που πιστεύει ότι είναι σωστές για
την καλύτερη λειτουργία του υπό αν άπτυξη προγράμματος.

### [1.2 ΠΩΣ ΛΕΙΤΟΥΡΓΕΙ ΤΟ CVS.]{#ss1.2}

Η αρχή λειτουργίας του είναι πολύ απλή. Σε κάποιο server κάπου στο παγκόσμιο δίκτυο, είναι συγκεντρωμένος ο κώδικας ενός προγράμματος. Όταν κάποιος από την
ομάδα των προγραμματιστών που έχουν αναλάβει το project θέλει να κάνει μια αλλαγή στον κώδικα, αρκεί να συνδεθεί με τον εν λόγω server και να κατεβάσει το
αρχείο στο οποίο θέλει να κάνει την αλλαγή.

Κάνει την αλλαγή και μετά το ανεβάζει\... Φυσικά, οι λέξεις \"ανεβάσει\" και \"κατεβάσει\" δεν είναι οι καλύτερες για την περιγραφή της εργασίας που γίνεται,
μια και το CVS αναλαμβάνει να \`\`ενημερώσει\'\' όλα τα αρχεία που έχουν αλλάξει. Αυτό σημαίνει, ότι ο χρήστης στον τοπικό του δίσκο έχει όλα τα αρχεία του
project (ακόμα και το README) ακόμα και αν το μόνο που κάνει είναι\... ορθογραφική διόρθωση.

Μόλις γίνει μια ενημέρωση, το CVS \`\`μαρκάρει\'\' την νέα έκδοση με ένα minor αριθμό παραπάνω. Αυτό σημαίνει ότι από 1.3 το κάνει 1.4 (Φυσικά αυτή η αλλαγή
μπορεί να είναι και από 1.5.3.4.2 σε 1.5.3.4.3). Την ίδια στιγμή, ο χρήστης που έκανε την αλλαγή, είναι υποχρεωμένος να γράψει και μια μικρή παρατήρηση. Επίσης
μαρκάρεται η ώρα της αλλαγής και το όνομα αυτού που την έκανε. Κάτι τέτοιο βοηθάει τους άλλους προγραμματιστές να μπορούν με ευκολία να απαντήσουν σε ερωτήματα
του τύπου

-   Ποιός έκανε την αλλαγή;
-   Πότε έγινε;
-   Γιατί έγινε;
-   Τι προσφέρει στον κώδικα αυτή η αλλαγή;

Αλλά πριν συνεχίσουμε, ας δούμε πώς μπορούμε να στήσουμε το δικό μας δέντρο CVS με απλές εντολές.


### [2. ΣΤΗΣΙΜΟ CVS ΣΤΟΝ ΥΠΟΛΟΓΙΣΤΗ ΣΑΣ]{#s2}

Πριν να μπορέσουμε να τρέξουμε και να κάνουμε την ενημέρωση, πρέπει να έχουμε δηλώσει μια μεταβλητή συστήματος, την CVSROOT. Αυτή είναι η διαδρομή στον
απομακρυσμένο server που βρίσκονται τα προς λήψη αρχεία.

Αν και λογικά για να διαβάζετε αυτό το άρθρο ξέρετε πως να θέσετε μια μεταβλητή συστήματος, θυμίζω για τους νέους: Ο τρόπος είναι ανάλογος του shell που
χρησιμοποιεί ο καθένας.

Η πλειοψηφία έχει bash (CVSROOT=\':pserver:anonymous\@cvs.enlightenment.org:/cvs/enlightenment\' ; export CVSROOT) και υπάρχουν και λίγοι (αλλά δυνατοί!) με csh
ή κάτι αντίστοιχο (setenv CVSROOT = \':pserver:anonymous\@cvs.enlightenment.org:/cvs/enlightenment\')

### [2.1 LOGIN ΚΑΙ ΕΡΓΑΣΙΑ ΣΕ ΕΝΑ CVS SERVER]{#ss2.1}

Επόμενο βήμα είναι να κάνουμε login σε ένα CVS server, στην παραπάνω περίπτωση θα κάνουμε Login στον CVS server που περιέχει τον enlightenment.

> ----------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>     cvs login
>
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------

Σε αυτό το σημείο θα σας ζητήσει ένα password, πατήστε απλά ENTER. Δεν θα χρειαστεί να ξανακάνουμε αυτό το βήμα, εκτός αν κόψουμε πλέον τη σύνδεση!

Από αυτό το σημείο και πέρα, θα πάρουμε όλη τη δομή καταλόγου του project στο δίσκο μας.

**ΣΗΜΕΙΩΣΗ: Αν και για να μπορέσουμε να κάνουμε τον enlightenment να δουλεύει, πρέπει να κατεβάσουμε πολλά modules, εδώ θα αναφερόμαστε σε ένα για συντομία
χρόνου και χώρου.**

Ο enlightenment αποτελείται από πολλά modules. Αυτά είναι:

-   e
-   Eterm
-   imlib
-   fnlib
-   esound
-   audiofile

Εμείς θα ασχοληθούμε με το module της imlib, μιας βιβλιοθήκης διαχείρισης γραφικών (μπορείτε φυσικά να διαλέξετε ένα άλλο module)

Την κατεβάζουμε λοιπόν τοπικά με την εντολή:

> ----------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>     cvs -z3 checkout imlib
>
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------

Φυσικά, μπορούμε να πάρουμε και πάνω από ένα module με μια εντολή:

> ----------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>     cvs -z3 checkout imlib fnlib ...
>
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------

Σε αυτό το σημείο έχουμε κατεβάσει όλο τον κώδικα του module, και είμαστε έτοιμοι να κάνουμε τις αλλαγές που θα κρίνουμε απαραίτητες ή αν δεν είμαστε στο
development team απλά να κάνουμε compile τον νέο μας κώδικα!

**ΠΡΟΣΟΧΗ: Δεν είναι ανάγκη να κάνουμε καμμία αλλαγή, οι άνθρωποι που γράφουν τον κώδικα ξέρουν τι κάνουν.** Αν και εσείς ξέρετε τι κάνετε, δεν το βρίσκω πρέπoν
να τους αλλάξουμε των κώδικά τους!! (εκτός και αν ανήκετε στο development team).

Ας δούμε το directory structure που δημιουργήθηκε στο δίσκο μας. Έχει δημιουργηθεί ο κατάλογος `imlib/` που περιέχει όλον τον κώδικα, και ένας κατάλογος `CVS/`,
στον οποίο το cvs έχει καταγεγραμμένες πληροφορίες για καθένα από τα αρχεία ώστε να μπορεί να καταλάβει τι αλλαγές κάναμε από τότε που το κατεβάσαμε (Αυτό
χρειάζεται για την περίπτωση που θέλουμε να το ανεβάσουμε με δικές μας αλλαγές, ώστε να ξέρει τι log file να δημιουργήσει).

Έχουμε πλέον την πιο νέα έκδοση του πακέτου αυτού!

Φυσικά, αυτό δεν είναι πάντα καλό, μια και πολλές φορές το πακέτο που μόλις κατεβάσαμε δεν κάνει compile καν! Φυσικό, όπως αντιλαμβάνεστε, μια και μιλάμε για
ΧΟΝΤΡΟ development, όπου συνήθως ενσωματώνονται νέα χαρακτηριστικά. Είναι λοιπόν πιθανότατο ακόμα και αν κάνει compile να μας \`\`κολλάει\'\' συνεχώς (core
dumped κ.λπ.). Σε αυτή την περίπτωση ή προσπαθούμε να το φτιάξουμε μόνοι μας, ή\... περιμένουμε να βγει νεότερη έκδοση. Σε καμία περίπτωση μη στείλετε mail
στους developers να τους πείτε \`\`δεν δουλεύει αυ τό\'\'. Πιστέψτε με, το ξέρουν καλύτερα από εμάς!!

### [2.2 ΑΝΑΝΕΩΣΗ ΤΟΥ ΚΩΔΙΚΑ]{#ss2.2}

Την επόμενη φορά που θα πάμε στο CVS server για ανανέωση, δεν θα κάνουμε checkout, αλλά update. Κάτι τέτοιο σημαίνει ότι θα μας έρθουν μόνο τα πακέτα που έχουν
αλλάξει, και όχι όλα από την αρχή. Αυτό μπορεί να γίνει με την εντολή:

> ----------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>     cvs -z3 update -Pd imlib
>
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------

Φυσικά, κάνουμε την προσευχή μας να κάνει compile. Αν και πιστεύω ότι δεν θα εισακουστεί (μιλάω εκ πείρας), πάντα υπάρχουν οι εξαιρέσεις, και πάντα γίνονται
θαύματα.

Οι απλοί χρήστες που θέλουν να έχουν την πιο νέα έκδοση του λογισμικού στο δίσκο τους, και όχι να γράφουν κώδικα, **μόλις τελείωσαν το διάβασμα αυτού του
άρθρου**. Στη συνέχεια, αυτό που εξηγείται είναι το πως το cvs καταφέρνει να τα βγάζει πέρα με τυχόν conflicts (π.χ.: δύο developers την ίδια στιγμή έκαναν
revisions στο ίδιο αρχείο), το πως μπορούμε να δημιουργήσουμε νέα αρχεία ή και ολόκληρα directories και να τα συμπεριλάβουμε στο repository του module.

Όσοι δεν ασχολείστε με προγραμματισμό, μην συνεχίσετε το διάβασμα, εκτός αν θέλετε να μάθετε εγκυκλοπαιδικά πως δουλεύει το CVS. Δεν είναι τίποτα δυσνόητο, αλλά
κατά πάσα πιθανότητα δε θα σας ενδιαφέρει.


### [3. CVS FOR DEVELOPERS]{#s3}

### [3.1 Αλλαγές στον κώδικα και πώς να τις ενσωματώσουμε στο Repository του Project.]{#ss3.1}

Οι αλλαγές που τυχόν θα γίνουν θα γραφούν τοπικά στο δικό σας δίσκο, και όχι στο server. Αυτό πάει να πει ότι οι άλλοι developers δεν θα δουν τις αλλαγές σας,
μέχρι να σιγουρευτείτε ότι αυτό που κάνατε δουλεύει και μόνο αν του το πείτε θα τα ανεβάσει. Αυτό γίνεται με την εντολή **`/cvs commit`**

Πριν γίνει όμως το γράψιμο στο server, πρέπει πάνω του να υπάρχει η έκδοση των αρχείων που είχατε κατεβάσει ώστε τυχόν αλλαγές που έκαναν άλλοι developers να
μην χαθούν (αυτός είναι ο σκοπός του directory CVS/ που έχει δημιουργηθεί στην ιεραρχία καταλόγων στο δίσκο σας). Κάνουμε λοιπόν ένα

> ----------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>     cvs update imlib
>
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------

Έστω ότι κάναμε αλλαγές στο αρχείο README, αλλά άλλος ένας έχει κάνει αλλαγές τόσο στο ίδιο αρχείο όσο και στο αρχείο Makefile στο μεσοδιάστημα. Μετά την εντολή
update, βλέπουμε την έξοδο:

> ----------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>     cvs update: Updating .
>     U Makefile
>     RCS file: /imlib/README
>     retrieving revision 1.5
>     retrieving revision 1.6
>     Merging differences between 1.5 and 1.6 into README
>     M README
>
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------

Όλα αυτά σημαίνουν:

>     U Makefile

Οι αλλαγές που έκανε ο άλλος κατέβηκαν στο δίσκο μας.

>     RCS file: /imlib/README
>     retrieving revision 1.5
>     retrieving revision 1.6
>     Merging differences between 1.5 and 1.6 into README

Αυτό μας δείχνει ότι οι δύο revisions 1.5 και 1.6 του αρχείου README συγχωνεύτηκαν σε ένα αρχείο, το README, τοπικά, στο δίσκο μας.

>     M README

Το γράμμα Μ, φανερώνει ότι το αρχείο έχει αλλαχθεί από εμάς, και ότι οι αλλάγες δεν ανέβηκαν ακόμα (φυσικό αυτό, ένα update κάναμε.

Ας μην ξεχνάμε ότι τώρα το αρχείο README περιλαμβάνει και τις αλλαγές του άλλου!!! Καλό (απαραίτητο για να είμαι ακριβής) θα είναι να κάνουμε έναν έλεγχο να
δούμε αν δουλεύει ακόμα ο κώδικας. Φυσικά, στην περίπτωσή μας, δεν είναι ανάγκη, γιατί είναι ένα text κείμενο, που δεν επηρεάζει τη λειτουργικότητα του όλου
project (αυτό δεν σημαίνει ότι δεν θα ήταν καλό να ελέγξουμε τί αλλαγές έκανε ο άλλος).

Καλό θα είναι πριν κάνουμε commit, να ξανακάνουμε update, ώστε στο διάστημα που κάναμε τον έλεγχο να μην έγινε καμμία άλλη αλλαγή (πράγμα σπάνιο). Η έξοδος,
καλώς εχόντων των πραγμάτων, θα είναι:

> ----------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>     cvs update: Updating .
>     M README
>
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------

\`Αρα, οι μόνες αλλαγές είναι στο δίσκο μας. Πάμε για commit.

> ----------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>     $ cvs commit 
>     README
>
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------

Τώρα θα μας ζητηθεί να γράψουμε ένα μικρό κείμενο που θα εξηγεί στους άλλους τι αλλαγές κάναμε και γιατί. Μόλις τελειώσουμε, θα πάρουμε από το CVS:

> ----------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>     Checking in README;
>     /imlib/README,v  <--  README
>     new revision: 1.7; previous revision: 1.6
>
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------

Τώρα, οι αλλαγές μας θα είναι πάνω στο server, και οι άλλοι προγραμματιστές όταν θα κάνουν cvs update θα τις πάρουν στο δίσκο τους.

### [3.2 CONFLICTS]{#ss3.2}

Κάτι τέτοιο είναι εφικτό στην περίπτωση που οι γραμμές που αλλάζουν οι δύο developers δεν είναι ίδιες. Αν όμως τύχει και αλλάζουν και οι δύο την ίδια γραμμή;

Σε αυτή την περίπτωση έχουμε conflict, και το cvs μας αφήνει να βρούμε μόνοι μας τη λύση. Μας αφήνει με ένα αρχείο, στο οποίο φαίνεται η περιοχή που έγινε το
conflict, περιέχει και τις δύο απόψεις (τη δική μας και αυτή που έρχεται σε αντίθεση με τη δική μας, του άλλου προγραμματιστή) και είμαστε αναγκασμένοι να το
ελέγξουμε, να κάνουμε τυχόν αλλαγές και να ξανακάνουμε commit. Αυτό, αν και ακούγεται δύσκολο, είναι πολύ εύκολο (και φυσικά απαραίτητο) γιατί ο τρόπος που μας
έχει φτιάξει το αρχείο βοηθάει στην κ ατανόηση του προβλήματος που έχει δημιουργηθεί. Από εκεί και πέρα, είναι απαραίτητο να έχουμε σωστή κρίση ώστε να αφήσουμε
στον κώδικα την καλύτερη λύση από τις δύο προτεινόμενες (ακόμα και αν αυτή δεν είναι η δική μας!)

### [3.3 ΠΑΡΑΚΟΛΟΥΘΗΣΗ ΑΛΛΑΓΩΝ]{#ss3.3}

Για να μπορέσουμε να δούμε τις αλλαγές που έχουν γίνει σε ένα αρχείο του project, θα χρησιμοποιήσουμε την εντολή **`cvs log`**

> ----------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>     cvs log README
>
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------

Θα μας παρουσιαστεί ένα κατεβατό με μια περιγραφή του αρχείου, τον τρέχοντα αριθμό αναθεώρησης, καθώς και όλες τις αναθεωρήσεις που του έχουν γίνει, καθώς και
το log για κάθε μια από αυτές.

### [3.4 ΠΡΟΣΘΕΣΗ - ΑΦΑΙΡΕΣΗ ΑΡΧΕΙΩΝ]{#ss3.4}

Η πρόσθεση και η αφαίρεση αρχείων γίνεται όπως και με τις αλλαγές σε αρχεία, αφού πρώτα καταγραφούν οι αλλαγές στο cvs directory που έχει δημιουργήσει. Με αυτό
τον τρόπο (και μόνο) μπορεί το cvs να ξεχωρίσει τι αλλαγές έχουν γίνει.

#### ΠΡΟΣΘΕΣΗ

Το να προσθέσουμε απλά ένα αρχείο στο directory structure του δίσκου μας, δεν είναι αρκετό. Σε αυτή την περίπτωση, το cvs θα μας πει με πολύ κομψό τρόπο ότι δεν
έχει ακουστά αυτό το αρχείο ακόμα (CVS doesn\'t know about this file yet) στο επόμενο update.

Για να το προσθέσουμε, πρέπει να κάνουμε cvs add. Έστω ότι δημιουργήσαμε το αρχείο colors.c. Για να ολοκληρωθεί η διαδικασία πρόσθεσης του αρχείου, κάνουμε τα
εξής βήματα (με \$ αρχίζουν οι εντολές που δίνουμε, τα άλλα είναι η έξοδος του cvs).

> ----------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>     $ cvs add colors.c
>     cvs add: scheduling file `colors.c' for addition
>     cvs add: use 'cvs commit' to add this file permanently
>     $ cvs update
>     cvs update: Updating .
>     A colors.c --- The file is marked for addition.
>     $ cvs commit colors.c
>     (...Το cvs θα μας ζητήσει να δώσουμε εδώ ένα κείμενο για το log...)
>     RCS file: /imlib/colors.c
>     done
>     Checking in colors.c;
>     /imlib/colors.c,v  <--  colors.c
>     initial revision: 1.1
>     done
>     $
>
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------

Παρατηρούμε και την αρχική αρίθμηση, που είναι από το 1.1. Από αυτή τη στιγμή το αρχείο που προσθέσαμε βρίσκεται στο repository του project, και οι χρήστες που
θα κάνουν update, θα το πάρουν μαζί με όλα τα άλλα του project.

#### ΑΦΑΙΡΕΣΗ

Αν απλά αφαιρέσουμε ένα αρχείο από το directory structure του σκληρού μας, φυσικά και δεν φεύγει από το server. Μάλιστα, όταν κάνουμε cvs update, το αρχείο θα
επαναδημιουργηθεί. Αυτό βοηθάει πολύ σε περιπτώσεις που έχουμε κάνει πολλές αλλαγές σε ένα αρχείο και αποφασίσουμε ότι κάναμε λάθος και τελικά δεν έπρεπε να
γίνουν αλλαγές. Σε αυτή την περίπτωση απλά σβήνουμε το αρχείο και κάνουμε ένα update.

Είναι κατανοητό ότι η αφαίρεση ενός αρχείου είναι επικίνδυνο παιχνίδι, και γιαυτό το cvs δεν αφήνει πλήρη ελευθερία στον χρήστη. Φυσικά, μπορεί να δημιουργηθεί
μια \`\`αφαίρεση\'\', η οποία όμως θα είναι πλασματική. Δηλαδή: Για να διαγράφεί ένα αρχείο, πρέπει πρώτα να το σβήσουμε από το δίσκο μας, και να γράψουμε την
εντολή

> ----------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>     cvs rm `filename'
>     cvs commit `filename'
>
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------

Πάντως, αυτό δεν το καταστρέφει από το server. Απλά φτιάχνει μια νέα \`\`αναθεώρηση\'\' στην οποία χαρακτηρίζεται ως \`\`ανύπαρκτο\'\'. Υπάρχει ακόμα όμως, και
μπορεί να ανακληθεί π.χ. με την εντολή cvs log.


### [4. ΕΠΙΛΟΓΟΣ]{#s4}

