Οδηγίες χρήσης του Code Repository
Δημοσιεύθηκε από Κώστας Αναγνώστου στο Ιουλίου 23, 2009
O darklynx ετοίμασε τις παρακάτω αναλυτικές οδηγίες για όσους επιθυμούν να χρησιμοποιήσουν code repository μέσω SVN για να βελτιώσουν και να επεκτείνουν το κώδικα των παραδειγμάτων των tutorials. Τον ευχαριστώ ιδιαίτερα για αυτό και για την γενικότερη προσπάθεια που έχει καταβάλει στο στήσιμο του project αυτού.
Θέλω να επισημάνω ότι αν κάποιος αναγνώστης δεν επιθυμεί να εμπλακεί στην διαδικασία αυτή, μπορεί και πάλι να βρει σε zip το κώδικα του κάθε tutorial στην ιστοσελίδα του Code Repository.
Επίσης θέλω να παρατηρήσω ότι η ενασχόληση σας με αυτόν τον τρόπο συνεργατικής ανάπτυξης κώδικα θα είναι χρήσιμη εμπειρία, μιας και οι περισσότερες (σχετικά μεγάλες και σοβαρές) εταιρίες ανάπτυξης λογισμικού, και εκτός της βιομηχανίας βιντεοπαιχνιδιών, χρησιμοποιούν ένα ανάλογο σύστημα διαχείρισης κώδικα.
Θυμίζω ότι για να ανεβάσετε το δικό σας κώδικα στο Repository, πρέπει να έχετε δημιουργήσει ένα λογαριασμό στο Google (gmail) και να μας στείλετε το google email μαζί με το όνομα σας μέσω της φόρμας επικοινωνίας του blog.
Επίσης καλό θα ήταν να ενημερώνετε το σχετικό post του Videogames Laboratory Forum με ότι αλλαγές και προσθήκες έχετε κάνει στο Code Repository. Με τον τρόπο αυτό θα μπορούν οι ενδιαφερόμενοι να πληροφορηθούν γρήγορα για την κίνηση στο Repository.
Ακολουθούν λοιπόν οι οδηγίες χρήσης του Code Repository μέσω SVN:
————————————————————————————————
To code repository του blog που γίνεται host στο Google Code αξιοποιεί το SVN Version Control System για εύκολη και διακριτή παρουσίαση τόσο της εξέλιξης του κώδικα κατά την εξέλιξη ενός μαθήματος, όσο και των προσθηκών από τους αναγνώστες που εμπλουτίζουν με τις ιδέες τους το περιεχόμενο του μαθήματος.
Όσοι έχετε προηγούμενη εμπειρία με το SVN μπορείτε να χρησιμοποιήσετε τα εργαλεία της επιλογής σας και απλά να παρακολουθήσετε το υπόλοιπο μέρος του οδηγού για το πως αναμένεται να κάνετε τις προσθήκες σας. Όσοι δεν έχετε προηγούμενη εμπειρία με το SVN θα ξεκινήσουμε κάνοντας μια πολύ συνοπτική περιγραφή του τι είναι το SVN.
Το SVN είναι ένας πολύ ισχυρός τρόπος να δουλεύουν πολλοί χρήστες πάνω στα ίδια αρχεία και φακέλους. Ο κάθε χρήστης μπορεί να έχει μια εκδοχή του κάθε αρχείου πάνω στο οποίο δουλεύει και να στέλνει τις αλλαγές που κάνει στο repository (commit) ή να λαμβάνει τις αλλαγές που έχουν κάνει άλλοι (update). Κάθε αλλαγή αποθηκεύεται ως νέο revision, το οποίο περιέχει το νέο directory tree και το όνομα και τα σχόλια του συντάκτη.
Για να τα κάνετε όλα αυτά είναι απαραίτητη η ύπαρξη ενός SVN Client στον υπολογιστή σας. Αν δεν χρησιμοποιείτε ήδη έναν τότε συστήνεται να κατεβάσετε και να εγκαταστήσετε τον πολύ καλό TortoiseSVN . Μετά το απαραίτητο restart ώστε να εφαρμοστούν οι αλλαγές στο Windows shell είμαστε έτοιμοι να τον χρησιμοποιήσουμε (αν έχετε όρεξη κοιτάξτε το documentation του Tortoise SVN που είναι πολύ καλό και κατατοπιστικό):
1) Πρώτα από όλα πρέπει να φτιάξουμε ένα σημείο στο οποίο θα στεγάσουμε την τοπική εκδοχή του project (τα λεγόμενα working copies). Φτιάξτε λοιπόν ένα νέο φάκελο στον υπολογιστή σας και δώστε του ένα όνομα (έστω VideoGamesLab). Κάντε τώρα δεξί κλικ στο φάκελο και παρατηρήστε ότι προστέθηκαν νέες επιλογές στο right-click menu. Αυτή που μας ενδιαφέρει για αρχή είναι η SVN Checkout… η οποία θα κατεβάσει την πρόσφατη εκδοχή του κώδικα των μαθημάτων. Το στοιχείο που μας ενδιαφέρει στο dialog που εμφανίζεται είναι το url που θα βάλουμε. Έχετε δύο επιλογές ανάλογα με το αν είστε εγγεγραμμένοι στο repository ή όχι:
α) Αν είστε ανώνυμοι χρήστες μπορείτε να κατεβάσετε μια readonly (δηλαδή δεν μπορείτε να αλλάξετε τον κώδικα στο repository αλλά είστε ελεύθεροι να τον χρησιμοποιήσετε στις εφαρμογές σας όπως θέλετε) εκδοχή βάζοντας ως url http://videogameslab.googlecode.com/svn/trunk/.
β) Αν είστε εγγεγραμμένοι τότε το πρώτο βήμα είναι να μάθετε τα στοιχεία σας.Κάντε λοιπόν sign in στο Google account σας, μπείτε στο Profile σας πάνω δεξιά και σημειώστε τα εξής: i) το user id σας ii) από το tab Settings το Googlecode.com password. Επιστρέφουμε λοιπόν στο dialog του SVN Checkout και βάζουμε ως url το
https://videogameslab.googlecode.com/svn/trunk/. Όταν σας ζητηθεί id και password βάλτε αυτά που μόλις σημειώσατε και αν επιθυμείτε αποθηκεύστε το authentication σας, ώστε να μην χρειάζεται να ξανατυπώνεται τα στοιχεία σας κάθε φορά που κάνετε κάποια ενέργεια.
Σημειωτέον ότι μόλις εξοικειωθείτε με την διαδικασία θα μάθετε εύκολα να κατεβάζετε μέρος μόνο ενός project (π.χ https://videogameslab.googlecode.com/svn/trunk/XNA Lessons) ή τον κώδικα των αναγνωστών (https://videogameslab.googlecode.com/svn/branches) απλά αλλάζοντας το url κάθε φορά. Στη σελίδα του project στο tab source επιλέξτε browse για να εξοικειωθείτε σταδιακά με το πως είναι οργανωμένα τα αρχεία.
Κρατήστε το φάκελο για ευκολία. Αν τον σβήσετε τότε πρέπει να επαναλάβετε τα παραπάνω.
2) Καθώς τα μαθήματα θα προχωράνε ο κώδικας θα εξελίσσεται, πρέπει λοιπόν η τοπική σας εκδοχή να είναι ενημερωμένη. Ανά τακτά διαστήματα λοιπόν αυτό που πρέπει να κάνετε είναι να κάνετε δεξί κλικ στον φάκελο που φυλάξατε (τον VideoGamesLab δηλαδή) και να επιλέγετε TortoiseSVN->SVN Update. Πατήστε OK και αν σας ζητηθεί βάλτε το id και το password σας.
3) Καθώς διαβάζετε τον κώδικα των μαθημάτων είναι πολύ πιθανό να σας έρθει μια καλή ιδέα που να τον βελτιώνει, ή να προσθέτει καινούργια χαρακτηριστικά. Αλλά πως θα τα ανεβάσετε στο repository σε ένα διακριτό σημείο δίχως να μπερδεύεται με τον κώδικα των μαθημάτων ή με προσθήκες άλλων χρηστών; Η λύση είναι να κάνετε Commit τις αλλαγές σας σε ένα νέο παρακλάδι (branch) του project. Μπορείτε λοιπόν είτε να κάνετε τροποποιήσεις απευθείας στον φάκελο όπως επιθυμείτε είτε καλύτερα ακολουθώντας το βήμα 1 να φτιάξετε ένα νέο φάκελο (όχι μέσα στο VideoGamesLab) που να περιέχει το project και να δουλεύετε ξεχωριστά σε αυτόν. Θυμηθείτε όμως να κάνετε ένα Update πριν ξεκινήσετε ώστε η δουλειά σας να είναι στο τελευταίο μάθημα (αν αυτό επιθυμείτε φυσικά).Οι αλλαγές σε ήδη υπάρχοντα αρχεία ανιχνεύονται αυτόματα δίχως άλλες ενέργειες από μέρους σας. Αν όμως χρειαστεί να προσθέσετε αρχεία ή φακέλους κάντε δεξί κλικ πάνω τους και επιλέξτε TortoiseSVN->Add… και επιλέξτε τα νέα στοιχεία. Καλό είναι σε αυτό το σημείο να εξοικειωθείτε με τα εικονίδια που το πρόγραμμα προσθέτει στα αρχεία, ώστε να καταλάβετε τις αλλαγές που έχουν συμβεί ή θα συμβούν.
Όταν είστε λοιπόν έτοιμοι με τις αλλαγές σας είναι η ώρα για να φτιάξετε το καινούριο branch. Επειδή πιθανότατα κάνατε αλλαγές στον κώδικα ενός μόνο μαθήματος επιλέξτε μόνο το μάθημα που ασχοληθήκατε (π.χ τον φάκελο Pong στα XNA Lessons). Κάντε δεξί κλικ και επιλέξτε TortoiseSVN->Branch/Tag… Στο πεδίο To url θα πρέπει να πληκτρολογήσετε https://videogameslab.googlecode.com/svn/branches/MyBranchName, όπου mybranchname το όνομα του νέου σας branch. Μια καλή ιδέα είναι να βάζετε το user name σας ως branch name.Βάλτε επίσης στο textbox που δέχεται τα comments μια μικρή περιγραφή του τι αλλαγές κάνατε (είπαμε μικρή
). Στο Create copy in the repository from: επιλέξτε Working Copy ώστε να αντιγραφούν οι δικές σας αλλαγές στο branch που θα δημιουργηθεί. Τέλος αν ακολουθήσατε τη συμβουλή μου και φτιάξατε νέο φάκελο με το project πιθανόν να επιθυμείτε αυτός ο φάκελος να αλλάξει και να επικοινωνεί πλεόν με το branch αντί για το trunk. Αν ναι επιλέξτε Switch working copy to new branch/tag. Αν δεν το επιλέξετε ο φάκελος δεν θα επηρεαστεί οπότε μην ανησυχείτε. Πατήστε OK και αν σας ζητηθεί βάλτε το id και password.
4) Πως θα χειριστείτε όμως το νέο branch στο μέλλον; Έχετε τις εξής επιλογές:
i) Θέλετε ένα νέο φάκελο στον υπολογιστή σας με τα περιεχόμενα του branch; Δουλέψτε με την SVN Checkout… βάζοντας ως URL αυτό του branch.
ii) Θέλετε να κάνετε update τον φάκελό σας που περιέχει μια παλιά έκδοση ενός branch ώστε να συμπεριληφθούν οι αλλαγές άλλων χρηστών (παρόλο που αποθαρρύνονται οι χρήστες να “πειράζουν” άλλα branches); Εκτελέστε μια SVN Update εντολή με το url του branch.
iii) Θέλετε να στείλετε τις αλλαγές σας στο branch σας; Κάντε δεξί κλικ και επιλέξτε SVN Commit…Αν δεν βλέπετε την επιλογή είναι πιθανό ότι ο φάκελος δεν είχε πριν συσχετιστεί με το branch είτε με το Branch/Tag… είτε με το Checkout.
Savoire vivre του repository:
Το SVN σύστημα είναι φτιαγμένο ώστε να φαίνεται εύκολα ποιος έκανε αλλαγές και που. Όμως για να γλυτώσουμε τους υπόλοιπους από το να χρειάζεται να κάνουν διαρκείς ελέγχους παρακαλείστε να ακολουθείτε τις εξής κατευθυντήριες γραμμές:
α) Μην κάνετε Commit τις αλλαγές σας στο trunk.Ο συγγραφέας του blog θα καταλάβει τις αλλαγές αλλά εσείς πιθανόν όχι. Όταν χρειαστεί λοιπόν να δουλέψετε στις προηγούμενες αλλαγές σας ενδέχεται να τις κάνετε overwrite με τον κώδικα του συγγραφέα χωρίς καν να το καταλάβετε.Φτιάξτε ένα νέο branch και δουλέψτε εκεί δίχως ενόχληση.
β) Αν διαβάζοντας ένα branch ενός άλλου αναγνώστη σας έρθουν ιδέες για την βελτίωσή του μην τις κάνετε Commit στο δικό του branch. Είναι πιθανό να μπερδευτείτε και οι δυο σας ή ακόμα χειρότερα ένας νέος επισκέπτης του repository. Αντ’αυτού φτιάξτε ένα νέο branch και βάλτε ως σχόλιο ένα link στο branch το οποίο σας ενέπνευσε.
Πιθανόν νιώθετε ήδη έντονο πονοκέφαλο παρότι καλύψαμε μόνο τις πιο συνηθισμένες λειτουργίες
. Θα διαπιστώσετε γρήγορα όμως πως τα παραπάνω θα σας σώσουν από μεγαλύτερους πονοκέφαλους στο εγγύς μέλλον. Φυσικά οι administrators θα αναλάβουν να σας ξελασπώσουν σε όποια προβλήματα αντιμετωπίσετε. Καλό programming λοιπόν!

konsnos είπε
Πολύ καλός οδηγός αλλά κόλλησα εκεί που αναφέρεται το Switch working copy to new branch/tag . Τι ακριβώς κάνει αυτή η επιλογή; Μέσα στον φάκελο που έκανα το SVN Checkout, δοκίμασα να προσθέσω τον δικό μου φάκελο (να τον δημιουργήσω δηλαδή από την αρχή), αλλά μου τον βγάζει με ένα ερωτηματικό και με δεξί κλικ δεν έχω την επιλογή TortoiseSVN->Branch/Tag.
Αν κατάλαβα σωστά, τότε τις επεξεργασίες μου θα πρέπει να τις κάνω στο VideoGamesLab\XNA Lessons\Pong; Δεν μπορώ σε άλλον φάκελο;
darklynx είπε
Όταν προσθέτεις ένα στοιχείο μέσα στο φάκελο VideoGamesLab πρέπει με την εντολή Add να δείξεις στο πρόγραμμα ότι θα παρακολουθεί και αυτό το στοιχείο (γι’αυτό σου βγάζει το ερωτηματικό-δεν ξέρει αν θες να το παρακολουθεί).
Ένα branch αποτελεί ένα παρακλάδι από την κύρια πορεία του project.Π.χ φτιάχνω ένα branch του Pong με 3(!) παίκτες από τον φάκελο του Pong με το Add Branch όπως γράφει ο οδηγός.Το Switch working copy to new branch/tag λέει στο πρόγραμμα ότι αυτό το παρακλάδι θα το φτιάξει αντιγράφοντας την δική σου εκδοχή (με τις αλλαγές που έκανες τοπικά) του στοιχείου που επέλεξες (ο φάκελος Pong π.χ).
Ο φάκελος δεν είναι ανάγκη να είναι ο ίδιος αργότερα,στον οδηγό δείχνει πως αφού φτιάξεις το branch μπορείς σε έναν άλλο φάκελο στον υπολογιστή σου να κάνεις Checkout με url αυτό του νέου branch.Π.χ αν τώρα σε ένα φάκελο κάνεις Checkout με url https://videogameslab.googlecode.com/svn/branches/konsnos θα γέμιζε με τα περιεχόμενα του κώδικα που είχες δώσει για το Pong και αποτέλεσε το πρώτο branch του μαθήματος.Όποιες αλλαγές έκανες στο φάκελο αυτόν και τις έκανες Commit θα ανέβαιναν στο αντίστοιχο branch του repository.
Ελπίζω να σε κάλυψε η απάντησή μου.
darklynx είπε
Και εννοείται πως branches μπορούν να γίνουν από οποιοδήποτε φάκελο μέσα στο VideoGamesLab,όχι μόνο από το Pong που είχε χρησιμοποιηθεί ως παράδειγμα.Πρέπει όμως να επιλέξεις ένα ήδη υπάρχον φάκελο για να δημιουργήσεις το branch άσχετα του τι καινούριο θα προσθέσεις μέσα σε αυτόν.
konsnos είπε
Θα προσπαθήσω να το δοκιμάσω, αλλά λόγο της απειρίας μου ίσως φέρω την καταστροφή (ελπίζω να μην έχω τα δικαιώματα). Το λέω για να γνωρίζετε πως αν κάτι δεν πάει καλά δεν είναι επίτηδες. Αν προκύψουν και άλλες απορίες θα τις παραθέσω.
Και πάλι ευχαριστώ για τον οδηγό. Είναι πραγματικά πολύ χρήσιμος για τους νέους στον προγραμματισμό και το πως γίνεται η οργάνωση του κώδικα σε εταιρείες.
darklynx είπε
Όπως γράφει και ο οδηγός όλες οι αλλαγές καταγράφονται.Αν λοιπόν προσθέσεις,διαγράψεις ή κάνεις οτιδήποτε στο κύριο κομμάτι του κώδικα το να χρησιμοποιήσουμε την αμέσως προηγούμενη έκδοση είναι πάρα πολύ απλό.Ο λόγος που συνέστησα να δουλεύεται σε ξεχωριστά branches είναι για να μην υπάρχει η ανάγκη να ελέγχετε ποιος έκανε τι και πότε-έχετε το δικό σας χώρο να δουλέψετε δίχως να έχετε την έγνοια αν κάποιος άλλος έγραψε κάτι άλλο από πάνω και ξεχάσατε να το κοιτάξετε.
Αν αποδειχτεί ότι όλοι μας σαν αναγνώστες το υιοθετήσουμε σωστά και το κατέχουμε θα μπορούσε να περάσει στο επόμενο επίπεδο,να δουλέψουμε ομαδικά πάνω στον ίδιο κώδικα και όχι σε παρακλάδια του.Θα μπορούσε π.χ ο κος Αναγνώστου να μας βάζει ακόμα και ασκήσεις από το blog αυτό τις οποίες θα συνεργαζόμασταν να λύσουμε στο repository.
Προς το παρόν όμως επίκειται η εξοικείωση με το SVN…
konsnos είπε
Δεν βρίσκω τρόπο να επικοινωνήσω με άλλα μέλη του svn. Υπάρχει τρόπος ή δεν προσφέρεται κάτι τέτοιο;
darklynx είπε
Μπορείς να χρησιμοποιήσεις τη φόρμα επικοινωνίας για να έρθεις σε επαφή με τους administrators ή να χρησιμοποιήσεις τον issue tracker για θέματα που αφορούν τη λειτουργία του repository.Επικοινωνία με τη μορφή μηνυμάτων δεν υποστηρίζει το google code.
konsnos είπε
Άφησα ένα draft comment στον κώδικα του spahar εδώ. Θα πάρει ειδοποίηση για αυτό;
Επίσης τι είναι ο issue tracker; Κάτι σαν bug report αν δεν κάνω λάθος; Όταν δηλώνεται ένα issue παίρνουμε ειδοποίηση; Μπορείς να κάνεις ένα issue δοκιμαστικά να δούμε πως εμφανίζεται;
darklynx είπε
Αμφιβάλλω αν θα λάβει ειδοποίηση.Ο issue tracker είναι κάτι σαν problem report μαζί με αναφορά σχολίων και προτάσεων.Ξέρω ότι ειδοποιεί αυτόν που έφτιαξε το issue για απαντήσεις εφόσον το επιτρέψει από τα settings του,όχι όμως σίγουρα και τους υπόλοιπους.
Σπύρος (spahar) είπε
Δε μπορώ να δω το comment, στη σειρά 225 δεν υποτίθεται ότι είναι;
Εκτός των άλλων δεν εμφανίζονται τα Ελληνικά στα σχόλια του κώδικα, ασχέτως κωδικοποίησης (UTF-8, Greek).
darklynx είπε
Ναι,το παρατήρησα κι εγώ.Όταν όμως κατεβάσετε το αρχείο εμφανίζεται κανονικά.
konsnos είπε
Νομίζω τώρα φαίνεται το comment. επέλεξα μια επιλογή publish comment στα δεξιά.
jupiter είπε
Καλησπέρα και απο μένα.. Προσπαθώ να κάνω Commit και μου ζητάει user/pass αλλά δεν λέει να περάσει το authentication! Να και το log:
Commit
Commit failed (details follow):
MKACTIVITY of ‘/svn/!svn/act/8c46219c-58e1-cd44-bfbb-82b4b7a47c7c’:
authorization failed: Could not authenticate to server: rejected Basic
challenge (http://videogameslab.googlecode.com)
Χρησιμοποιώ τα credentials: mzervos/(auto-generate pass απτα settings)
) αλλά το ίδιο αποτέλεσμα.. Καμιά ιδέα?
Έχω κάνει checkout σε ένα φάκελο όλο το repository (https://videogameslab.googlecode.com/svn/) και απλά κάνω αλλαγές στο δικό μου branch.
Προσπάθησα να κάνω commit στο δικό μου branch και στο root folder (μην ανησυχείτε, μόνο στο δικό μου branch έκανα αλλαγές
Μήπως επιτρέπεται να κάνω commit μόνο στο trunk (αν και περίεργο μου φαίνεται αυτό)? Ρωτάω γιατί στην σελίδα εδώ http://code.google.com/p/videogameslab/source/checkout γράφει μόνο για το το trunk:
# Project members authenticate over HTTPS to allow committing changes.
svn checkout https://videogameslab.googlecode.com/svn/trunk/ videogameslab –username mzervos
konsnos είπε
Καλημέρα
Στο branch έχει προστεθεί το branch σου βλέπω. http://code.google.com/p/videogameslab/source/browse/#svn/branches/mzervos
Ίσως να έπεσε ο σέρβερ εκείνη την στιγμή. Τον κωδικό σου θα τον βρεις εδώ: http://code.google.com/hosting/settings εκεί που λέει Your googlecode.com password:
jupiter είπε
Το βλέπω το branch ναι, αλλά δεν μπορώ να κάνω commit.. Ουτέ τώρα μπορώ! Τον κωδικό απο εκεί τον έχω πάρει..