Είναι ένα άρθρο από μόνο του να σας εξηγήσω τι ακριβώς είναι το GIT και γιατί είναι σημαντικό, ρίξτε μια ματιά σε αυτό εδώ το Ελληνικό
άρθρο που περιγράφει τι ακριβώς ειναι το GIT. Για περίπου μισό χρόνο το χρησιμοποιούσα τοπικά, δούλευα δηλαδή κώδικα σε Desktop και Laptop και με ενδιάμεσες υπηρεσίες όπως το
http://www.bitbucket.org όλα δούλευαν καλύτερα απο ποτέ. Όμως είχα ένα πρόβλημα. Έπρεπε τις τελικές αλλαγές στο πραγματικό (LIVE site) να τις κάνω με το "χέρι" και FTP!
Μπορεί να μου έλυνε τα χέρια το GIT αφού μέσω του ιστορικού του έβλεπα ποια αρχεία έπρεπε να αντικαταστήσω, αλλά και πάλι ειναι πολύ χρονοβόρο και μπορείς πάντα να ξεχάσεις κάτι, ή ακόμα χειρότερα να προκύψει κάποιο πρόβλημα και να μην μπορείς εύκολα και με μια εντολή να γυρίσεις στην μορφή που δούλευε. Έτσι και αλλιώς η λογική "backup/restore" σε τέτοιες περιπτώσεις ειναι απαραίτητη, αλλά αλήθεια τώρα, δεν έχω ιδέα πόσες ώρες έχω χάσει απο την ζωή μου κάνοντας backup και τρέμοντας μην διαλυθεί το live site όσο αλλάζω τα αρχεία μέσω FTP. Μετα απο αρκετό ψάξιμο κατάφερα τελικά να χρησιμοποιήσω το GIT αντί για FTP. Αν και η δουλειά του δεν είναι αυτή θεώρησα πάρα πολύ σημαντικό να καταφέρω κάτι τέτοιο, αφού πλέον εύκολα μπορείς να μεταφέρεις τις αλλαγές στον πραγματικό Live Server χωρίς να χρησιμοποιείς καθόλου FTP σύνδεση. Νιώθω ήδη καλύτερα,μπορώ να κάνω ότι αλλαγές θέλω και να γυρίσω πίσω σε αυτό που ήταν - αν κάτι δεν πάει καλά - μέσα σε δευτερόλεπτα.
Θεωρώ ότι δεν είστε αρχάριος, έχετε εγκασταστήσει τοπικά (στο pc/laptop σας) το GIT και έχετε πρόσβαση στον Server σας μέσω Shell. Αν δεν καταλαβατε καν τι είπα, αφήστε σχόλιο και θα προσπαθήσω να σας βοηθήσω με παραπομπές.
Εγκατάσταση στον Server
Θα ξεκινήσουμε δημιουργώντας ένα αποθετήριο στο πραγματικό μας site. Ας το ονομάσουμε "myproject" και θεωρούμε ότι βρίσκεται στον server εδώ
/home/username/myproject
$ cd /home/username/myproject && git init
To επόμενο βήμα ειναι να δημιουργήσουμε ένα "γυμνό" αποθετήριο, επίσης στον server και να "σπρώξουμε"(Push) το τοπικό μας αποθετήριο σε αυτό. Ας το φτιάξουμε στο
/var/git για παράδειγμα. Πρέπει να βεβαιωθείτε ότι μπορείτε να γράψετε σε αυτό (έχετε τα αντίστοιχα δικαιώματα)
$ mkdir -p /var/git/myproject.git && cd /var/git/myproject.git
$ git init --bare
Ρύθμιση παραμέτρων και "hooks"
Πρέπει να δηλώσουμε ότι το αποθετήριο με χρέη "hub" (το γυμνό αποθετήριο που φτιάξαμε λίγο νωρίτερα) είναι το "απομακρυσμένο"(remote) αποθετήριο μας. Για να γίνει αυτό πρέπει να επεξεργαστείτε το
/home/username/myproject/.git/config και να προσθέσετε τις εξής γραμμές στο τέλος του
[remote "hub"]
url =/var/git/myproject.git fetch = +refs/heads/*:refs/remotes/hub/*
Στην συνέχεια θα πρέπει να εισάγουμε ένα - ή και περισσότερα εφόσον θέλετε - hooks (αρχείο εντολών που ενεργοποιείται
μέσω κάποιου γεγονότοτος). Αυτό το "hook" στην προκειμένη θα έχει ως στόχο κάθε φορά που γίνεται ένα "push" sto "hub" αποθετήριο να μεταφέρει τις αλλαγές στο πραγματικό.
Τα hooks αποθηκεύονται στην διαδρομή .git/hooks, οπότε πρέπει να το δημιουργήσουμε στο
/var/git/myproject.git/hooks/post-update:
#!/bin/sh
echo
echo "**** Pulling changes into Live [Hub's post-update hook]"
echo
cd /home/username/myproject || exit
unset GIT_DIR
git pull hub master
exec git-update-server-info
ΣΗΜΑΝΤΙΚΟ: Πρέπει να βεβαιωθούμε ότι έχει δικαιώματα "εκτέλεσης"
$ chmod +x /var/git/myproject.git/hooks/post-update
Κλωνοποίηση και σπρώξιμο(Push) στο ενεργό site.
To επόμενο βήμα ειναι να "σπρώξετε" (push) το site σας απο το τοπικό σας μηχάνημα, στον Server σας!. Θεωρούμε ότι ειναι .git enabled, αλλιώς κάντε init όπως κάνουμε πάντα για ένα νέο git αποθετήριο. Αφού λοιπόν βρεθείτε στο τοπικό σας root folder πρέπει να δηλώσετε τον Server σας, ώστε με μια εντολή να μεταφέρετε τις αλλαγές σας στον live server. Θα χρησιμοποιήσουμε την εντολή "git remote add" γι'αυτό τον λόγο. Πρέπει όμως πρώτα να δηλώσουμε τον USER ( συνήθως ειναι ο ίδιος με τον FTP user που έχουμε για να συνδεθούμε σε ένα site), οπότε αντικαταστήστε το με τον δικό σας όνομα χρήστη και βεβαιαωθείτε ότι επιπλέον ο χρήστης αυτός έχει SHELL δικαίωματα. Στους Cpanel enabled servers υπάρχει ειδική ρύθμιση γι'αυτό, να δηλώσεις δηλαδή ποιος χρήστης μπορεί να συνδέεται μεσω Shell.
$ git remote add live user @ yourserver.com:/var/git/myproject.git
$ git push live master
Τώρα λοιπόν απο το μηχάνημά σας έχετε "ανεβάσει" το site σας στον Server. Αν κάτι δεν έχει πάει καλά, βεβαιωθείτε ότι ο χρήστης "user" που γράφει η εντολή remote είναι ο δικός σας χρήστης, υπάρχει και έχει δικαιώματα πρόσβασης με Shell.
Αυτό που σίγουρα θέλει προσοχή είναι τα δικαιώματα των αρχείων, ώστε να μπορεί να γράψει πληροφορία το/τα Hook στο live directory. Τέλος είναι καλό να προστατευτεί η πρόσβαση στον .git κατάλογο του ενεργού(Live) Site σας.
H καλύτερη λύση μέσω του Apache.conf
# do not allow .git version control files to be issued
<Directorymatch "^/.*/\.git+/">
Order deny,allow Deny from all </Directorymatch>
<Files ~ "^\.git">
Order allow,deny Deny from all
</Files>
'Η αν δεν έχετε πρόσβαση μπορείτε να το κάνετε και μέσω αρχείου .htaccess
RewriteEngine On
RewriteRule ^(.*/)?\.git+ - [F,L]
ErrorDocument 403 "Access Forbidden"
Για την ροή της δουλειάς με βοήθησε επίσης αρκετά αυτή εδώ η ιστοσελίδα
http://nvie.com/posts/a-successful-git-branching-model/. Αξίζει την ανάγνωση σας!
Αν όλα έχουν πάει όπως πρέπει τότε έχετε το workflow που έχω και εγώ για τα περισσότερα Project. Με ένα
git push live ενημερώνω τον live Server, με ένα
git push origin ενημερώνω το bitbucket λογαριασμό που έχει καθήκοντα backup και Sync.