Revision Control Tools

Από Κοινότητα Ελεύθερου Λογισμικού ΕΜΠ
Μετάβαση σε: πλοήγηση, αναζήτηση


Ίσως το πιο χρήσιμο εργαλείο για ένα προγραμματιστή, μετά από την αγαπημένη του γλώσσα προγραμματισμού και έναν καλό επεξεργαστή κειμένου, είναι ένα σύστημα για source code revision control.

Εκτός από ένα πολύ δυνατό εργαλείο για τη διαχείριση πολλαπλών εκδόσεων ενός προγράμματος, και τη διατήρηση ενός λεπτομερούς ιστορικού της εξέλιξης του κώδικα, αποτελεί μονόδρομο για την από κοινού ανάπτυξη κώδικα από μια ομάδα ατόμων.

Αν δεν γνωρίζατε λοιπόν για το revision control, ή δεν το χρησιμοποιούσατε μέχρι τώρα, καιρός να αρχίσετε· μετά από λίγο καιρό χρήσης δεν θα μπορείτε να φανταστείτε πως αναπτύσσατε προγράμματα χωρίς ένα τέτοιο εργαλείο :).


Βασικές έννοιες

Οι λειτουργίες που επιτελεί ένα revision control system (RCS), μπορούν να χωριστούν σε δύο κατηγορίες.

Από τη μία φροντίζει να κρατάει ένα ιστορικό με τις διαφορετικές εκδόσεις των αρχείων που "παρακολουθεί". Από την άλλη βοηθάει στην από κοινού τροποποίηση των αρχείων από διαφορετικά άτομα.

Αν και η ορολογία μπορεί να διαφέρει από σύστημα σε σύστημα, σε γενικές γραμμές ένα RCS δουλεύει ως εξής:

Αρχικά ο χρήστης δημιουργεί ένα repository, στο οποίο προσθέτει τα αρχεία που θέλει να παρακολουθεί. Στη συνέχεια επεξεργάζεται τα αρχεία αυτά, το λεγόμενο working copy. Όταν φτάσει σε μια έκδοση για την οποία θέλει να κρατήσει μια έκδοση, κάνει commit. Η έκδοση αυτή αποθηκεύεται μόνιμα στο repository, και ο κύκλος edit-commit επαναλαμβάνεται. Πλέον, ό,τι αλλαγές και να κάνει στα αρχεία (ακόμα και να τα σβήσει), θα μπορεί πάντοτε να επανέλθει σε κάποια έκδοση που έκανε commit, αν το επιθυμεί.

Επιπλέον, ένα repository μπορεί να προσπελαστεί με διάφορους μηχανισμούς και από άλλους χρήστες, αν αυτό είναι επιθυμητό. Τι συμβαίνει όμως όταν δύο χρήστες έχουν την έκδοση Α ενός αρχείου, και αφού την τροποποιήσουν, προσπαθήσουν να κάνουν commit της αλλαγές; Τα μοντέρνα συστήματα RCS έχουν διάφορους μηχανισμούς με τους οποίους ενημερώνουν το χρήστη σε τέτοιες περιπτώσεις, και τον βοηθούν να κάνει merge τις αλλαγές του με αυτές που έγιναν στο ενδιάμεσο, χωρίς να χαθεί κάποια από τις δυο (εφόσον αυτό έχει νόημα).

Ένα μοντέρνο RCS υποστηρίζει βέβαια επιπλέον λειτουργίες, όπως την εκτέλεση εντολών σε κάθε commit (π.χ. για να εκτελείται αυτομάτως μια σουίτα δοκιμών), τη δημιουργία παράλληλων διακλαδώσεων στην πορεία ενός project (branches), την αναζήτηση όρων σε όλες ή συγκεκριμένες εκδόσεις των αρχείων, την αναπαράσταση του ιστορικού με γραφικό τρόπο, την μετατροπή του ιστορικού από ή σε άλλο RCS, και άλλες πολλές.

Μια ειδοποιός διαφορά ανάμεσα στα RCS είναι το κατά πόσο είναι centralized ή distributed (κατανεμημένα). Σε ένα centralized RCS, το repository (δηλ. όλα τα μετα-δεδομένα που χρειάζεται το RCS για να λειτουργήσει, όπως π.χ. το ιστορικό των εκδόσεων) και το working copy (δηλ. τα αρχεία στα οποία δουλεύει ένας χρήστης) είναι διαχωρισμένα, και κατά κανόνα δεν βρίσκονται καν στον ίδιο υπολογιστή. Για κάθε λειτουργία (commit, update, diff κλπ), χρειάζεται επικοινωνία με το κεντρικό repository. Επιπλέον, το στήσιμο ενός repository, συνήθως αποτελεί ξεχωριστή διαδικασία, ενδεχομένως πολύπλοκη.

Αντιθέτως, σε ένα κατανεμημένο σύστημα, κάθε working copy είναι ταυτόχρονα και repository. Όλα τα commits γίνονται τοπικά, και υπάρχουν επιπλέον εντολές που "συγχρονίζουν" δύο repositories μεταξύ τους. Προφανώς ένα κατανεμημένο σύστημα μπορεί να λειτουργήσει και ως centralized, τηρώντας απλά ορισμένες συμβάσεις.

Μια εκτενέστερη εισαγωγή --και μάλλον περισσότερο καταννοητή-- γύρω από τις έννοιες του revision control, προσφέρεται στο πρώτο κεφάλαιο του svn book και του hg book αντίστοιχα.

Προγράμματα

CVS

Από τα πιο διαδεδομένα RCS, το CVS είναι πλέον σε μεγάλο βαθμό ξεπερασμένο, και δίνει τη θέση του σε νεότερα συστήματα όπως το SVN ή το Mercurial. Σίγουρα δεν αξίζει να χρησιμοποιηθεί σε ένα νέο project, αλλά υπάρχουν ακόμα αρκετά projects που δεν έχουν μεταφερθεί σε κάτι νεότερο.

Subversion

Το subversion (SVN) είναι ένα μοντέρνο centralized RCS, που αναπτύχθηκε με κύριο στόχο να αντιμετωπίσει ορισμένα προβλήματα στο σχεδιασμό του CVS. Σήμερα το έχει αντικαταστήσει σε μεγάλο βαθμό, και αποτελεί ένα από τα πλέον δημοφιλή open source RCS.

Mercurial

Κατανεμημένο RCS, γραμμένο σε Python, που αναπτύχθηκε αρχικά με στόχο την αντικατάσταση του κλειστού λογισμικού BitKeeper για τη διαχείριση του Linux kernel. Αν και τελικά δεν επιλέχθηκε, αποτελεί ένα από τα πλέον διαδεδομένα RCS και είναι εξαιρετικά απλό στο στήσιμο και τη χρήση.

Git

Το RCS που επιλέχτηκε τελικά ως αντικαταστάτης του BitKeeper από την ομάδα του Linux kernel, αναπτύχθηκε ειδικά για το σκοπό αυτό από το Linus Torvalds. Διαθέτει μερικά εξωτικά χαρακτηριστικά, αρκετά χρήσιμα σε μεγάλα projects με πολλούς developers και branches όπως ο kernel, αλλά είναι σχετικά πολύπλοκο στη χρήση.

http://git-scm.com/

Bazaar

Άλλο ένα κατανεμημένο RCS γραμμένο σε Python, χρησιμοποιείται και προωθείται κυρίως από την Canonical.

http://bazaar-vcs.org/

Darcs

Γραμμένο σε Haskell, ένα κατανεμημένο RCS με μια ιδιαίτερη προσέγγιση.

http://darcs.net/

Monotone

Από τα πρώτα κατανεμημένα RCS. Νεότερα συστήματα όπως το Mercurial και το SVN έχουν δανειστεί ορισμένες ιδέες από αυτό.

http://www.monotone.ca/

GNU arch

Άλλο ένα κατανεμημένο RCS, που όμως θεωρείται αργό και αρκετά πολύπλοκο στη χρήση.

http://www.gnu.org/software/gnu-arch/

RCS

Από τα παλιότερα revision control systems, αρκετά περιορισμένο σε λειτουργικότητα με τα σημερινά δεδομένα. Αποτέλεσε τη βάση για τις πρώτες εκδόσεις του CVS.

http://www.gnu.org/software/rcs/

Hosting

Η κοινότητα προσφέρει hosting για subversion και mercurial στα μέλη της. Δείτε το σχετικό post στο φόρουμ.

Για φοιτητές ΣΗΜΜΥ προσφέρεται υπηρεσία subversion από το Υπολογιστικό Κέντρο ΣΗΜΜΥ.

Σχετικά Άρθρα