Το προφίλ μας στο Google Plus
12

Το σύστημα ελέγχου εκδόσεων CVS

Μήπως το άρθρο για τα Version Control Systems στο deltaHacker Δεκεμβρίου σάς άνοιξε την όρεξη; Είστε έτοιμοι να δοκιμάσετε ένα VCS, για να δείτε αν είναι για σας; Στοιχηματίζουμε πως ναι, γι’ αυτό και στο παρόν άρθρο θα σας δείξουμε τις βασικές λειτουργίες του CVS, ενός repository centralized λογικής το οποίο –αν και από τα πιο παλιά– χρησιμοποιείται ακόμη και σήμερα σε αρκετά open source projects. Αν πάλι προτιμάτε κάποιο distributed repo, διαβάστε οπωσδήποτε το τεύχος Ιανουαρίου! Σ’ αυτό, το Mercurial περιμένει να σας κατακτήσει!

Μη βιαστείτε να πείτε ότι το CVS είναι ο παππούς των VCS γιατί θα φανείτε γελασμένοι. Το πρώτο πραγματικό version control ήταν το RCS και θα μπορούσαμε να πούμε ότι το CVS χτίζει πάνω σε αυτό. Ένας βασικός περιορισμός του RCS είναι ότι δεν διαχειρίζεται καταλόγους (ή φακέλους για όσους έρχονται από τον κόσμο των Windows). Θα μπορούσαμε λοιπόν να πούμε χονδρικά ότι το CVS είναι ένα RCS με φακέλους!

Το CVS είναι ένα repository που βασίζεται στην centralized φιλοσοφία. Αυτό πρακτικά σημαίνει ότι στο δίσκο σας (εφόσον το χρησιμοποιήσετε τοπικά) θα υπάρχει τόσο το repository σε έναν κατάλογο, όσο και μία ή περισσότερες περιοχές εργασίας. Σ’ αυτές θα κάνετε checkout, για να παίρνετε τα αρχεία που θα δουλεύετε, ενώ όταν τελειώνετε θα κάνετε checkin ή commit, για να μεταφέρετε τις αλλαγές σας στο repository. Βλέπετε ήδη ότι οι θεωρίες που σας λέγαμε στο τεύχος Δεκεμβρίου δεν πάνε χαμένες!

Εγκατάσταση του CVS
To CVS υπάρχει σίγουρα για οποιαδήποτε διανομή Linux που θα βρείτε. Χρησιμοποιήστε το εργαλείο αναζήτησης πακέτων της διανομής σας προκειμένου να βρείτε το πακέτο CVS. Για παράδειγμα, σε Debianοειδείς διανομές μπορείτε απλά να γράψετε:

# apt-get install cvs

Αν πάλι χρησιμοποιείτε FreeBSD, είστε τυχερός: To CVS υπάρχει στο βασικό σύστημα και δεν χρειάζεται να εγκαταστήσετε τίποτα. Αυτό απλά συμβαίνει επειδή το CVS χρησιμοποιείται από τους developers, μέχρι πριν λίγα χρόνια για όλα τα repositories του FreeBSD αλλά τώρα μόνο για το ports/doc/www. Αν λοιπόν το CVS είναι κατάλληλο για ένα μεγάλο project ίσως κάνει και για εσάς! Φυσικά μπορείτε να εγκαταστήσετε CVS και σε Windows. Αλλά αυτό να το ψάξετε μόνοι σας ;)

Ξεκινώντας με το CVS
Δημιουργήστε αρχικά ένα κατάλογο στον οποίο θα περιέχονται τα αρχεία του repository. Μπορείτε να τον ονομάσετε όπως θέλετε αλλά ας υποθέσουμε ότι πρόκειται να αποθηκεύσετε source code εκεί, οπότε ας τον πούμε scvs:

$ mkdir -p ~/repos/scvs

Θα δηλώσουμε τώρα ότι ο κατάλογος αυτός θα αποτελέσει τον κεντρικό για το repository μας, γνωστό στην ορολογία του CVS ως CVSROOT. Το CVSROOT είναι μια μεταβλητή περιβάλλοντος και τη ρυθμίζουμε εκτελώντας

$ export CVSROOT=~/repos/scvs

Την παραπάνω εντολή καλό είναι να τη βάλετε σε κάποιο αρχείο εκκίνησης του κελύφους σας, ώστε να εκτελείται αυτόματα κάθε φορά που κάνετε login: είναι βλέπετε απαραίτητη για κάθε ενέργεια που θα κάνετε στο repository. Μπορούμε τώρα να αρχικοποιήσουμε το repository:

$ cvs init

Αν είστε αρκετά περίεργοι για να μάθετε τι έγινε με αυτή την εντολή, θα δείτε ότι στον κατάλογο scvs δημιουργήθηκε ο κατάλογος CVSROOT με αρκετά αρχεία. Δεν πρέπει σχεδόν ποτέ να πειράξετε κάποιο από αυτά με το χέρι!

Θα κάνουμε τώρα το πρώτο μας checkout, το οποίο θα προετοιμάσει την περιοχή εργασίας μας:

$ mkdir ~/sources
$ cd ~/sources
$ cvs co .
cvs checkout: Updating CVSROOT
(και μια λίστα από αρχεία που ανήκουν στο CVS)

Τι σημαίνει η τελεία που βάλαμε; Στο CVS μπορούμε να επιλέξουμε ποιον κατάλογο από το repository θα κάνουμε checkout (στην ορολογία του CVS ονομάζονται modules). Τη δεδομένη στιγμή βέβαια απλώς δεν υπάρχει κανένα δικό μας module.

Ας γράψουμε το πρώτο μας αρχείο, ένα φοβερό και τρομερό hello world το οποίο θα θέσουμε υπό τον έλεγχο του repository. Χρησιμοποιήστε τον αγαπημένο σας editor για να γράψετε το παρακάτω και να το αποθηκεύσετε ως hello.c, φυσικά μέσα στον κατάλογο sources που δημιουργήσαμε:

#include <stdio.h>

int main()
{
    printf("Hello World!\n");
    return 0;
}

Ας δηλώσουμε τώρα στο repository πως θέλουμε να κρατάει αυτό το αρχείο:

$ cvs add hello.c
cvs add: scheduling file `hello.c' for addition
cvs add: use `cvs commit' to add this file permanently

Όπως καταλαβαίνετε, το add που κάναμε δεν έχει ακόμα καταχωρίσει το αρχείο μας στο repository. Απλώς έχει δοθεί η οδηγία να προστεθεί αυτόματα στο επόμενο commit. Αυτό μπορούμε να το δούμε γράφοντας:

$ cvs status hello.c
File: hello.c Status: Locally Added
Working revision: New File!
...

Βλέπετε ότι πρόκειται για νέο αρχείο, μόνο τοπικά (working copy) και δεν έχει ακόμα revision number, αλλά θα πάρει τώρα που θα κάνουμε το πρώτο μας commit:

$ cvs commit -m "Initial import of hello.c" hello.c
/home/user/repo/scvs/hello.c,v <-- hello.c
initial revision 1.1

Μπορείτε να παραλείψετε την παράμετρο -m και στην περίπτωση αυτή θα ανοίξει ένας editor για να γράψετε το μήνυμα που συνοδεύει το commit σας. Επίσης, δεν είστε υποχρεωμένοι να γράψετε το όνομα του αρχείου που θα κάνετε commit: Το CVS θα εξετάσει όλα τα αρχεία που υπάρχουν υπό τον έλεγχο του και θα κάνει commit μόνο όσα έχουν αλλάξει από το προηγούμενο revision (και φυσικά όσα έχετε εσείς προσθέσει με την add). Είναι ωστόσο καλή ιδέα να χρησιμοποιούμε τα ονόματα των αρχείων όταν αυτό είναι εφικτό. Το αρχείο “hello.c,v” δημιουργείται μέσα στον κατάλογο ~/repo/scvs και θα περιέχει πλέον τις εκδόσεις του hello.c που θα κάνουμε commit.

Ας κάνουμε μια αλλαγή στο hello.c. Προσθέστε την παρακάτω γραμμή κάτω από το printf:

printf("Hello CVS!\n");

και εκτελέστε:

$ cvs diff -u hello.c

Θα δείτε ένα unified patch που δείχνει τη διαφορά μεταξύ της παλιάς και της νέας έκδοσης. Με το + φαίνεται η γραμμή που προστέθηκε. Αν έχουμε σβήσει κάποια γραμμή από το αρχείο, θα φαίνεται με ένα μείον (-).

Ας προσθέσουμε ένα κατάλογο με ένα αρχείο στον έλεγχο του repo. Για παράδειγμα, αποφασίσατε ότι το φοβερό σας hello world χρειάζεται documentation και οδηγίες εγκατάστασης (λέμε τώρα), οπότε δημιουργήσατε τον κατάλογο docs και μέσα σε αυτόν το αρχείο README.

$ mkdir docs
$ cd docs
$ vi README <-- Γράψτε ό,τι νομίζετε μέσα εδώ...

Δείτε τώρα πώς θα προσθέσουμε τον κατάλογο και το αρχείο στο CVS:

$ cd ~/sources
$ cvs add docs/
Directory /home/user/repo/scvs/docs put under version control
$ cvs add docs/README
cvs add: scheduling file `docs/README' for addition
cvs add: use `cvs commit' to add this file permanently

Και τώρα πλέον μπορούμε να κάνουμε commit τα πάντα:

$ cvs commit -m "Second revision of hello.c. While here, add some docs to match"

Δεν αντιγράφουμε τα υπόλοιπα μηνύματα αλλά μένουμε σε αυτό που εμφανίζεται για το hello.c:

new revision: 1.2; previous revision 1.1

Τώρα που έχουμε δύο revisions, μπορούμε να ζητήσουμε τις διαφορές μεταξύ των δύο ως εξής:

$ cvs diff -u -r 1.1 -r 1.2 hello.c

Δοκιμάστε να αντιστρέψετε τη σειρά των 1.1 και 1.2 στην παραπάνω εντολή και θα καταλάβετε αμέσως τι γίνετε.

Τώρα που το repository μας έχει και έναν κατάλογο docs, μπορούμε να υποθέσουμε ότι κάποιος άλλος χρήστης (ενδεχομένως εσείς μετά από μερικές μπύρες με φίλους) θέλει να κάνει checkout *μόνο* τον συγκεκριμένο κατάλογο (ή module όπως είπαμε):

$ cd ~
$ cvs co docs/
U docs/README

Και ναι, αυτό που έγινε είναι ότι δημιουργήθηκε ένας κατάλογος docs/ με μόνο αρχείο το README. Ο φίλος μας έχει κάνει checkout μόνο το κομμάτι του repository που τον ενδιαφέρει. Αν εσείς κάνετε κάποια αλλαγή στο README και το κάνετε commit, ο άλλος χρήστης θα μπορεί να την πάρει ως εξής:

$ cd ~/docs
$ cvs update
cvs update: Updating .
U README

Αν πάλι καταστρέψετε κάποιο αρχείο και θέλετε να επιστρέψετε στην τελευταία έκδοση που είχατε κάνει commit, χρησιμοποιήστε την εντολή update:

$ cd ~/sources
$ rm hello.c
$ cvs update -A hello.c
cvs update: warning: hello.c was lost
U hello.c

Neither cat, nor damage! (ούτε γάτα, ούτε ζημιά :D). Υπάρχουν πολλά ακόμα που μπορούμε να σας πούμε για το CVS αλλά επειδή το site και το περιοδικό λέγονται deltaΗacker κι όχι cvsHacker, θα πρέπει να σταματήσουμε εδώ. Διαβάστε το man page του CVS ή ένα από τα άπειρα βιβλία/sites για το θέμα. Αν πιστεύετε ότι τα centralized VCS είναι πιο κοντά στον… τύπο σας, μάλλον θα θέλετε να δείτε και το Subversion το οποίο φτιάχτηκε για να είναι ένα καλύτερο CVS! Οι εντολές είναι αρκετά όμοιες (απλά γράφετε svn αντί για cvs), έχει όμως και διάφορες βελτιώσεις τις οποίες –είμαστε σίγουροι– θα ανακαλύψετε μόνοι σας!

12 Responses to “Το σύστημα ελέγχου εκδόσεων CVS”

  1. giwrg98 | 12/02/2012 at 18:21

    Το VCS είναι κατάλληλο για ένα άτομο;
    Επειδή θέλω να κάνω αλλαγές στα μικροπρογράμματά μου σε C και όταν τα κάνω μαντάρα να επαναφέρω τον προηγούμενο κώδικα, σκέφτομαι να διαλέξω ανάμεσα σε Centralised και Distributed. Άντε να το χρησιμοποιούν και άλλα ένα δύο άτομα για μικροbugs. Τι θα πρέπει να διαλέξω;

  2. sonic2000gr | 12/02/2012 at 19:12

    Ναι, τα VCS είναι κατάλληλα ακόμα και αν είσαι ο μοναδικός developer στο Project! Θα σου πρότεινα να διαλέξεις κάποιο από τα distributed. Και το mercurial και το git έχουν αντίστοιχες λειτουργίες και σε απλή χρήση δεν θα σε δυσκολέψει κανένα.

  3. mt0sh | 12/02/2012 at 20:39

    Το άρθρο ηταν η κατάλληλη αφορμή για κάτι project στο eclipse όπου συνεχως επρεπε να κανω “cp” τον φακελο σε άλλο folder ώστε να μην τον επηρεασουν οι νεες αλλαγές.

    Βέβαια ακομα με παιδευει το άτιμο :P

    Αλλά ειναι πολυ χρησιμο. Προσφερει ασφάλεια + ταχυτητα

    PS: αλλά νομιζω θελει ακομα πολυ προσεκτικη μελέτη για να μην πατησω κάτι κ τα κανω ολα μπαχαλο :S

    • sonic2000gr | 12/02/2012 at 21:28

      Μα το καλό με οποιοδήποτε VCS είναι ότι είναι αδύνατο να τα κάνεις όλα μπάχαλο! Από εκεί και πέρα βέβαια καλό είναι να πειραματιστείς με κάτι ακίνδυνο για να αποκτήσεις εμπειρία και να αισθάνεσαι άνετα με το σύστημα.

      • mt0sh | 13/02/2012 at 00:59

        στα κρισιμα σημεια παταω κ ενα copy :)

        • sonic2000gr | 13/02/2012 at 18:02

          Αν χρησιμοποιείς mercurial, κάνε μόνο ένα hg clone! Ακόμα και αν διαλύσεις τελείως το repo, μπορείς απλώς να το σβήσεις και να μετονομάσεις το clone.

          • mt0sh | 13/02/2012 at 21:45

            χμ ναι πολυ καλη ιδεα το clone δεν το χα σκεφτει για τετοια χρηση! ( που ειναι το κουμπακι να κανω +1 ? :P )

  4. giwrg98 | 12/02/2012 at 22:13

    Το add τι διαφορά έχει με το commit;

    • sonic2000gr | 12/02/2012 at 22:16

      Το add απλώς προσθέτει ένα αρχείο στη λίστα αρχείων που παρακολουθεί το repository. Το commit καταχωρεί τις αλλαγές σου στο αρχείο ως μια νέα έκδοση στο repository.

  5. mt0sh | 29/02/2012 at 00:02

    παντως πχ με το Eclipse ειναι λιγο δυσκολο να χεις κ την κονσολα παραλληλα ανοιχτη κ να κανεις συνεχεια add εκει..βεβαια πιο πριν εκανα πιο σπανια copy οποτε εχει νοημα αφου προφυλασσω καλυτερα τα αρχεια μου ετσι.

    Απλα οταν ειναι ολοκληρο Project ( οκ μεχρι 10αρια αρχεια ας πουμε ) με το καθενα να εχει το δικο του path στον δισκο ειναι δυσκολο να κανεις add καθε φορα που κανεις νεο αρχειο ( συχνα το ξεχναω )

    **path like this** : hg add /home/User/workspace/Wall/src/org/User/wall/WallActivity.java

    Απο την αλλη ολο το προτζεκτ δεν εχει κ νοημα… + το σχετικο plugin για Eclipse το βρηκα δυσχρηστο

    Μηπως εχω χασει κάποιο επεισοδιο ή ειμαι σε καλο μονοπατι? :P

  6. sonic2000gr | 29/02/2012 at 08:12

    Ξέρεις βέβαια ότι μπορείς να κάνεις hg add * και να αφήσεις το mercurial να προσθέσει οτιδήποτε δεν είναι ήδη under version control…
    Και για να αποφύγεις να προσθέσεις προσωρινά και άλλα αρχεία που δεν θες, ρίξε μια ματιά στη δημιουργία αρχέιου .hgignore.
    Τέλος, με hg status θα δεις (με ερωτηματικό) αρχεία που υπάρχουν στο κατάλογο εργασίας αλλά δεν γίνονται track από το repository.
    Σχετικά με τον τρόπο που δουλεύεις, καθένας έχει το δικό του – νομίζω θα βρεις τη λύση συνεχίζοντας να το ψάχνεις.

  7. mt0sh | 29/02/2012 at 18:19

    thnx πολυ πρακτικες οι συμβουλες σου.

Leave a Reply

You must be logged in to post a comment.

Σύνδεση

Αρχείο δημοσιεύσεων