Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Έχοντας σπαταλήσει χρόνο πολύ στον προγραμματισμό χωρίς version control, μπορώ να πω πως με το git που άρχισα να μαθαίνω μόλις πρόσφατα -- τα έχω εξομολογηθεί αυτά και σε άλλο νήμα -- αισθάνομαι (πέραν του "δες τι βλακεία έκανα τόσο καιρό") μια ευφορία ότι θα οργανώσω τα πάντα και θα κάνω παπάδες.

 

Σε ατομικό επίπεδο, μαθαίνω μάλλον [τα] εύκολα. Δουλεύοντας σε Linux, φτιάχνω συνήθως ένα project directory και δουλεύω επάνω του, χρησιμοποιώντας το git σαν ένα "άπειρο undo": commit, add, branch, checkout και ίσως remote, clone και push. Μόνο με αυτά νιώθω πως μπορώ να κάνω αρκετά και φυσικά εξακολουθώ να διαβάζω. Χρειάζομαι να καταλάβω ακόμα πολλά από θεωρία - έννοιες και πώς να τα εφαρμόσω εκτός από ατομικό και σε επίπεδο συνεργασίας με άλλους.

 

Επίσης προσπαθώ παλιές δουλειές (και όχι μόνο δικές μου) που έχουν γραφτεί χωρίς vc, δηλαδή κάνοντας το προπατορικό αμάρτημα του rename, να τις μεταφέρω σε git, φτιάχνοντας ένα αξιοπρεπές ιστορικό, να μπει σε τάξη όλος αυτός ο κώδικας.

 

Οπότε στο θέμα αυτό θα επανέρχομαι κατά καιρούς με ερωτήσεις να ζητάω τα φώτα σας. Ας περάσω στην πρώτη απορία:

 

Ένα από τα πρώτα που έχω διαπιστώσει είναι πως το git μπορεί να παρακολουθεί μόνο ένα directory (και ό,τι έχει μέσα). Έχω όμως γράψει κώδικα σε Linux που, για να λειτουργήσει, τα αρχεία διασπείρονται σε διάφορα directories. Αν χρησιμοποιώ σωστά τον όρο, έχουν ένα deployment layout που δεν συγκεντρώνεται σε ένα project directory.

 

Για παράδειγμα, ενδεικτικό, έχω γράψει μια ιστοσελίδα σε php που βρίσκεται στο /var/www/, αυτή διαβάζει δεδομένα από μια βάση που τεκμηριώνεται στο /home/user/sql. Ταυτόχρονα έχω ένα συγκεκριμένο crontab, γραμμές του οποίου πρέπει να βάλω μέσα στο project σε ένα αρχείο κειμένου π.χ. crontablines.txt. Κι αυτό το crontab τρέχει ένα perl script που έχω αποθηκεύσει στο /home/user/bin. Και σε κάποιο άλλο directory θα θέλω άλλο ένα bash script για την πρώτη εγκατάσταση για να προσθέτει τις γραμμές του προαναφερθέντος crontablines.txt μέσα στο crontab.

 

Φυσικά δεν είναι δυνατό να κάνω git init στο / και να κάνω επιλεκτικό git add ένα-ένα. Όλα τα αρχεία θα τα μαζέψω κάτω από ένα κοινό directory του project, με submodules ή με subdirectories (τα submodules τα ανακάλυψα πρόσφατα) και θα φτιάξω ένα σκριπτάκι για να γίνεται το deployment ή install. Δηλ. αν κάποιος κατεβάζει το source και θέλει να το ξεκινήσει (εδώ δεν έχω make) να τρέξει το σκριπτάκι και να κάνει τις αντιγραφές. Ή μήπως να έφτιαχνα symbolic links;

 

Απευθυνόμενος στην εμπειρία σας, έχετε μήπως καμιά ιδέα, πρόταση για κάτι πιο graceful; Σκέφτομαι ότι όλα αυτά τα διαφορετικά subdirectories που πρέπει να αντιγραφούν σε directories μέσα στο υπόλοιπο filesystem, κάπως πρέπει να τα αντιστοιχίσω. Έχετε αντιμετωπίσει κάτι παρόμοιο σε project, όπου για να δοκιμάσετε αν τρέχει αυτό που γράψατε, πρέπει πρώτα να αντιγράψετε τα αρχεία στις κατάλληλες θέσεις μέσα στο filesystem κι όχι μέσα στο κοινό directory όλου του project; Τι σκεφτήκατε, τι λύση δώσατε;

 

Ελπίζω να μην πλατειάζω στην προσπάθειά μου να γίνω κατανοητός.

Δημοσ.

Έχοντας σπαταλήσει χρόνο πολύ στον προγραμματισμό χωρίς version control, μπορώ να πω πως με το git που άρχισα να μαθαίνω μόλις πρόσφατα -- τα έχω εξομολογηθεί αυτά και σε άλλο νήμα -- αισθάνομαι (πέραν του "δες τι βλακεία έκανα τόσο καιρό") μια ευφορία ότι θα οργανώσω τα πάντα και θα κάνω παπάδες.

Συμφωνώ: το version control είναι αποκάλυψη, και το git ακόμα μεγαλύτερη :-) Βασικά μετά από αυτό, τα πιο απλά (π.χ. svn) μοιάζουν με παιδικά παιχνίδια που μάλιστα τα έχει φτιάξει κάποιος που ξέρει τα πολύ βασικά από παιχνίδια!

 

Ένα από τα πρώτα που έχω διαπιστώσει είναι πως το git μπορεί να παρακολουθεί μόνο ένα directory (και ό,τι έχει μέσα). Έχω όμως γράψει κώδικα σε Linux που, για να λειτουργήσει, τα αρχεία διασπείρονται σε διάφορα directories. Αν χρησιμοποιώ σωστά τον όρο, έχουν ένα deployment layout που δεν συγκεντρώνεται σε ένα project directory.

 

[...]

 

Φυσικά δεν είναι δυνατό να κάνω git init στο / και να κάνω επιλεκτικό git add ένα-ένα. Όλα τα αρχεία θα τα μαζέψω κάτω από ένα κοινό directory του project, με submodules ή με subdirectories (τα submodules τα ανακάλυψα πρόσφατα) και θα φτιάξω ένα σκριπτάκι για να γίνεται το deployment ή install. Δηλ. αν κάποιος κατεβάζει το source και θέλει να το ξεκινήσει (εδώ δεν έχω make) να τρέξει το σκριπτάκι και να κάνει τις αντιγραφές. Ή μήπως να έφτιαχνα symbolic links;

 

Απευθυνόμενος στην εμπειρία σας, έχετε μήπως καμιά ιδέα, πρόταση για κάτι πιο graceful; Σκέφτομαι ότι όλα αυτά τα διαφορετικά subdirectories που πρέπει να αντιγραφούν σε directories μέσα στο υπόλοιπο filesystem, κάπως πρέπει να τα αντιστοιχίσω. Έχετε αντιμετωπίσει κάτι παρόμοιο σε project, όπου για να δοκιμάσετε αν τρέχει αυτό που γράψατε, πρέπει πρώτα να αντιγράψετε τα αρχεία στις κατάλληλες θέσεις μέσα στο filesystem κι όχι μέσα στο κοινό directory όλου του project; Τι σκεφτήκατε, τι λύση δώσατε;

Νομίζω ότι αυτή είναι φυσιολογική κατάσταση για οποιοδήποτε στοιχειωδώς πολύπλοκο σύστημα, ειδικά στο Linux που οι φάκελοι του συστήματος έχουν συγκεκριμένους ρόλους. [Από την άλλη βέβαια, αρκετοί το παρακάμπτουν και φτιάχνουν έναν δικό τους φάκελο κάτω από το /opt όπου βάζουν τα πάντα μέσα.]

 

Η λύση προφανώς δεν είναι symbolic links. Σκέψου το εξής απλό: αφήνεις μια δουλειά στη μέση, και το σύστημα προσωρινά δεν δουλεύει. Θέλεις να μην δουλεύει και το εγκατεστημένο σύστημα; Μάλλον όχι :-) Άρα σε άλλο σημείο πρέπει να προγραμματίζεις και σε άλλο πρέπει να εγκαθιστάς το σύστημα, μόνο όταν δουλεύει. Η αυτοματοποίηση γίνεται με σκριπτάκι, makefile (ίσως το καλύτερο) ή άλλους παρόμοιους τρόπους. Υπάρχουν και τα git hooks, αλλά θέλουν και αυτά προσοχή στο πότε θα θέλεις να καλούνται.

Δημοσ.

Το git ΔΕΝ παρακολουθεί φακέλους. Μόνο αρχεία.

 

Τα submodules μπορείς να τα ξεχάσεις στο επίπεδο που είσαι. Αυτό που θες να μάθεις είναι intermediate πράγματα (conflict resolution, branching models, rebases κτλ) και όχι advanced.

 

Τα αρχεία τα βάζεις εκεί που πρέπει κατά το deployment (πχ με chef/puppet/ansible/shell scripts whatever).

Δημοσ.

Ένα από τα πρώτα που έχω διαπιστώσει είναι πως το git μπορεί να παρακολουθεί μόνο ένα directory (και ό,τι έχει μέσα).

Καταλαβαίνω πως το λες ότι δηλαδή το git μπορεί να παρακολουθεί μόνο από μία διαδρομή (εκεί που γίνεται το git init) και κάτω, αλλά για να μην μπερδευτεί κάποιος που θα διαβάσει το νήμα και σχηματίσει λάθος εντύπωση (και πιθανώς και εσύ να μην το έχεις καταλάβει σωστά), σημασία έχει αυτό που τόνισε ο pmav99.

 

Πολύς κόσμος (ειδικά όσοι προσπαθούν να χρησιμοποιήσουν το git σε trees που δεν περιέχουν κώδικα αλλά άλλους είδου αρχεία όπως πχ το /etc) διαπιστώνει ότι το git εκτός που δεν παρακολουθεί permissions, επίσης δεν εισάγει στο repo κενούς καταλόγους. Έτσι για να μην χάσουν τον κατάλογο πρέπει να δημιουργήσουν μέσα του ένα κενό αρχείο (πχ .gitignore). Αξίζει λοιπόν να θυμόμαστε αυτό που είπε ο pmav99 ότι δηλαδή το git δεν παρακολουθεί καταλόγους αλλά αρχεία (για την ακρίβεια το git παρακολουθεί μόνο περιεχόμενο και ούτε καν τα αρχεία το νοιάζουν αλλά για μην εισάγουμε δύσκολες έννοιες ας το αφήσουμε στο "παρακολουθεί αρχεία")

 

Έχω όμως γράψει κώδικα σε Linux που, για να λειτουργήσει, τα αρχεία διασπείρονται σε διάφορα directories. Αν χρησιμοποιώ σωστά τον όρο, έχουν ένα deployment layout που δεν συγκεντρώνεται σε ένα project directory.

 

Για παράδειγμα, ενδεικτικό, έχω γράψει μια ιστοσελίδα σε php που βρίσκεται στο /var/www/, αυτή διαβάζει δεδομένα από μια βάση που τεκμηριώνεται στο /home/user/sql. Ταυτόχρονα έχω ένα συγκεκριμένο crontab, γραμμές του οποίου πρέπει να βάλω μέσα στο project σε ένα αρχείο κειμένου π.χ. crontablines.txt. Κι αυτό το crontab τρέχει ένα perl script που έχω αποθηκεύσει στο /home/user/bin. Και σε κάποιο άλλο directory θα θέλω άλλο ένα bash script για την πρώτη εγκατάσταση για να προσθέτει τις γραμμές του προαναφερθέντος crontablines.txt μέσα στο crontab.

Ένα πράγμα που πρέπει να ξεκαθαρίσεις πρώτα είναι τίνος πράγματος τις αλλαγές θέλεις να αποθηκεύεις οπότε δηλαδή τι θέλεις να περιέχει το repo σου. Τα αρχεία της sql βάσης θέλεις να σώζονται στο repo ? Τι θα γίνει αν την ώρα που τρέχει η βάση εσύ αλλάξεις branch ή commit οπότε και θα αλλάξει το αρχείο ?

 

Τα αρχεία που δεν χρειάζονται να είναι στο repo μπορούν να υπάρχουν σε οποιονδήποτε κατάλογο θέλεις και απλά το script που τρέχεις για deployment θα τα αντιγράφει εκεί που πρέπει.

 

Όλα τα αρχεία θα τα μαζέψω κάτω από ένα κοινό directory του project, με submodules ή με subdirectories (τα submodules τα ανακάλυψα πρόσφατα) και θα φτιάξω ένα σκριπτάκι για να γίνεται το deployment ή install. Δηλ. αν κάποιος κατεβάζει το source και θέλει να το ξεκινήσει (εδώ δεν έχω make) να τρέξει το σκριπτάκι και να κάνει τις αντιγραφές. Ή μήπως να έφτιαχνα symbolic links;

Όταν ο torvalds έγραψε το git είχε μια πολύ καλή ιδέα για το τι χρειάζεται στην παρακολούθηση του πυρήνα. Έτσι το git υποστηρίζει ένα κάρο "advanced" πράγματα τα οποία υλοποιήθηκαν σωστά γιατί υπήρχε από την αρχή ένα καλό σχέδιο. Από εκεί και πέρα όμως, όταν το git απέκτησε τεράστια δημοφιλία και άρχισε να χρησιμοποιείται και για να κρατάει την λίστα με τα ψώνια του σουπερ μάρκετ στο tablet, χρειάστηκαν κάποια πράγματα για τα οποία δεν υπήρχε πρόνοια και τα οποία υλοποιήθηκαν κάπως γρήγορα και δεν "έδεσαν" τόσο καλά με το υπόλοιπο οικοσύστημα.

 

Για να μην τα πολυλογώ, τα submodules πολύ σπάνια είναι η ιδανική λύση. Μια συμβουλή που επιπλέει στο διαδίκτυο και λέω και εγώ εδώ στο φόρουμ είναι ότι, όπως είπε και ο pmav99, όσο είσαι αρχάριος μην ασχολείσαι με submodules. Όταν θα φτάσεις σε ένα ικανοποιητικό επίπεδο και μπορείς να κρίνεις τα υπέρ και τα κατά τους, τότε θα δεις ότι δεν θα θέλεις να ασχοληθείς με submodules :P

 

Αν θέλεις να χρησιμοποιήσεις symlinks, μπορείς να έχεις όλα τα πραγματικά αρχεία μέσα στον κατάλογο του repo σου και να τα κάνεις symlinks στους εξωτερικούς καταλόγους (δηλαδή το /home/user/bin/perl_script να είναι το symbolic link στο αρχείο που θα υπάρχει μέσα στο repo).

Δημοσ.

Όσα λες για αρχεία σε άλλο path (ή και για config lines σε διάφορα σημεία του λειτουργικού)…

Αυτή είναι δουλεία του installer / uninstaller / upgrade script και όχι του version control

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...