Git
Chapters ▾ 2nd Edition

2.6 Τα θεμελιώδη στοιχεία του Git - Χρησιμοποιώντας ετικέτες

Χρησιμοποιώντας ετικέτες

Το Git, όπως και τα περισσότερα συστήματα ελέγχου έκδοσης, δίνει την δυνατότητα να βάλετε ετικέτες σε συγκεκριμένα σημεία του ιστορικού ενός έργου. Η λειτουργικότητα αυτή χρησιμοποείται συνήθως για σημειωθούν συγκεκριμένες εκδόσεις (π.χ. έκδοση 1.0 κ.ο.κ.). Στο κεφάλαιο αυτό θα μάθετε πως να βλέπετε αυτές τις ετικέτες σε ένα έργο, πως να τις δημιουργείτε καθώς και ποιοι διαφορετικοί τύποι ετικετών υπάρχουν.

Απαριθμώντας τις ετικέτες

Για να δείτε τις ετικέτες ενός έργου, η εντολή στο Git είναι αρκετά σαφής. Απλά πληκτρολογήστε git tag:

$ git tag
v0.1
v1.3

Η εντολή θα απαριθμήσει τις ετικέτες σε αλφαβητική σειρά, αν και η σειρά αυτή δεν έχει κάποια ιδιαίτερη σημασία.

Μπορείτε επίσης να αναζητήσετε ετικέτες με συγκεκριμένα μοτίβα. Για παράδειγμα, το αποθετήριο με τον πηγαίο κώδικα του Git περιέχει περισσότερες από 500 ετικέτες. Αν ενδιαφέρεστε να δείτε μόνο αυτές που έχουν σχέση με την έκδοση 1.8.5, τότε μπορείτε να εκτελέσετε:

$ git tag -l 'v1.8.5*'
v1.8.5
v1.8.5-rc0
v1.8.5-rc1
v1.8.5-rc2
v1.8.5-rc3
v1.8.5.1
v1.8.5.2
v1.8.5.3
v1.8.5.4
v1.8.5.5

Δημιουργώντας ετικέτες

Το Git χρησιμοποιεί δύο κατηγορίες ετικετών, τις ελαφρείς (lightweight) και τις ετικέτες με σημειώσεις (annotated).

Μια ελαφριά ετικέτα μοιάζει πολύ με έναν κλάδο που δεν αλλάζει. Η ετικέτα αυτού του τύπου είναι απλά ένας δείκτης σε μια συγκεκριμένη υποβολή.

Οι ετικέτες με σημειώσειες από την άλλη, αποθηκεύονται στη βάση δεδομένων του Git. Για κάθε μία ετικέτα με σημειώσεις, υπολογίζεται το checksum της το οποίο περιέχει: το όνομα αυτού που βάζει την ετικέτα, την διεύθυνση e-mail του, την ημερομηνία, καθώς και το μήνυμα της ετικέτας. Η ετικέτα αυτή μπορεί να υπογραφεί και να επαληθευθεί μέσω του GNU Privacy Guard (GPG). Είναι γενικά προτιμώμενο να χρησιμοποιείτε ετικέτες με σημειώσεις έτσι ώστε να έχετε όλη αυτή την πληροφορία. Παρ' όλα αυτά, αν για κάποιο λόγο θέλετε να χρησιμοποιήσετε μια ετικέτα χωρίς περεταίρω πληροφορίες για αυτή, μπορείτε να χρησιμοποιήσετε τις ελαφρείς ετικέτες.

Ετικέτες με σημειώσεις

Η δημιουργία μιας ετικέτας με σημειώσεις είναι απλή. Ο ευκολότερος τρόπος είναι να χρησιμοποιήσετε την επιλογή -a όταν εκτελείτε την εντολή tag:

$ git tag -a v1.4 -m 'my version 1.4'
$ git tag
v0.1
v1.3
v1.4

Η επιλογή -m προσδιορίζει το μήνυμα της ετικέτας, το οποίο και αποθηκεύεται μαζί με την ετικέτα. Αν δεν προσδιορίσετε κάποιο μήνυμα σε μια καινούρια ετικέτα με σημειώσεις, τότε το Git θα εκκινήσει έναν επεξεργαστή κειμένου ώστε να γράψετε το μήνυμα εκεί.

Χρησιμοποιώντας την εντολή git show μπορείτε να δείτε τις πληροφορίες που περιέχει μια ετικέτα:

$ git show v1.4
tag v1.4
Tagger: Ben Straub <ben@straub.cc>
Date:   Sat May 3 20:19:12 2014 -0700

my version 1.4

commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the version number

Η εντολή αυτή μας δείχνει πληροφορίες για τον χρήστη που έβαλε την ετικέτα, την ημερομηνία που χρησιμοποιήθηκε η ετικέτα στην υποβολή, καθώς και το μήνυμά της.

Ελαφρείς ετικέτες

Ένας άλλος τρόπος για να βάλετε ετικέτες στις υποβολές είναι οι ελαφρείς ετικέτες. Η ετικέτα δεν περιλαμβάνει καμία περαιτέρω πληροφορία εκτός από το checksum της υποβολής σας. Για να δημιουργήσετε μια τέτοια ετικέτα, θα πρέπει να μην χρησιμοποιήσετε τις επιλογές -a, -s, ή -m:

$ git tag v1.4-lw
$ git tag
v0.1
v1.3
v1.4
v1.4-lw
v1.5

Αν τώρα εκτελέσετε την εντολή git show για την συγκεκριμένη ετικέτα, δεν θα δείτε τις επιπλέον πληροφορίες μιας ετικέτας. Η εντολή θα μας δείξει απλά την υποβολή:

$ git show v1.4-lw
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the version number

Αναθέτοντας ετικέτες αργότερα

Μπορείτε επίσης να αναθέσετε ετικέτες σε παλαιότερες υποβολές. Έστω λοιπόν ότι το ιστορικό υποβολών σας είναι κάπως έτσι:

$ git log --pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
a6b4c97498bd301d84096da251c98a07c7723e65 beginning write support
0d52aaab4479697da7686c15f77a3d64d9165190 one more thing
6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc added a commit function
4682c3261057305bdd616e23b64b0857d832627b added a todo file
166ae0c4d3f420721acbb115cc33848dfcc2121a started write support
9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme

Ας υποθέσουμε τώρα ότι ξεχάσατε να βάλετε ετικέτα στο άργο σας στην έκδοση 1.2 που ήταν η υποβολή με το μήνυμα “updated rakefile”. Μπορείτε να βάλετε την ετικέτα όποτε θέλετε. Για να το κάνετε αυτό, θα πρέπει να προσδιορίσετε το checksum της υποβολής σας (ή ένα μέρος του) στο τέλος της εντολής:

$ git tag -a v1.2 9fceb02

Μπορείτε τώρα να δείτε ότι έχετε προσθέσει την ετικέτα στην υποβολή:

$ git tag
v0.1
v1.2
v1.3
v1.4
v1.4-lw
v1.5

$ git show v1.2
tag v1.2
Tagger: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Feb 9 15:32:16 2009 -0800

version 1.2
commit 9fceb02d0ae598e95dc970b74767f19372d61af8
Author: Magnus Chacon <mchacon@gee-mail.com>
Date:   Sun Apr 27 20:43:35 2008 -0700

    updated rakefile
...

Κοινωποιώντας τις ετικέτες

Από προεπιλογή, η εντολή git push δεν μεταφέρει ετικέτες στους διακομιστές. Θα πρέπει να ορίσετε σαφώς ότι θέλετε να ωθήσσετε τις ετικέτες στον διακομιστή, αφού πρώτα τις δημιουργήσετε. Η διαδικασία αυτή είναι παρόμοια με το να κοινωποιείτε απομακρυσμένους κλάδους. Θα πρέπει λοιπόν να εκτελέσουμε την εντολή git push origin [tagname].

$ git push origin v1.5
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (14/14), 2.05 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
 * [new tag]         v1.5 -> v1.5

Αν έχετε πολλές ετικέτες που θέλετε να ωθήσετε με τη μία, μπορείτε επίσης να χρησιμοποιήσετε την επιλογή --tags στην εντολή git push. Με τον τρόπο αυτό θα μεταφέρετε στον διακομιστή όλες τις ετικέτες που δεν είναι ήδη εκεί.

$ git push origin --tags
Counting objects: 1, done.
Writing objects: 100% (1/1), 160 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
 * [new tag]         v1.4 -> v1.4
 * [new tag]         v1.4-lw -> v1.4-lw

Έπειτα, όταν κάποιος κλωνοποιήσει ή τραβήξει δεδομένα από το αποθετήριό σας, θα λάβει μαζί και όλες τις υπάρχουσες ετικέτες.

Ενημερώνοντας τις ετικέτες

Λόγω του γεγονότος ότι οι ετικέτες δεν μπορούν να μετακινηθούν, δεν μπορούμε να κάνουμε κανονική ενημέρωση του αποθετηρίου μας με βάση μια ετικέτα. Αν θέλετε να βάλετε μια έκδοση του αποθετηρίου σας στον κατάλογο εργασίας σας, η οποία να μοιάζει με μια συγκεκριμένη ετικέτα, μπορείτε να δημιουργήσετε έναν καινούριο κλάδο σε μια συγκεριμένη ετικέτα με την εντολή git checkout -b [branchname] [tagname]:

$ git checkout -b version2 v2.0.0
Switched to a new branch 'version2'

Αν βέβαια εκτελέσετε την παραπάνω εντολή και πραγματοποιήσετε μια υποβολή, ο κλάδος version2 θα είναι λίγο διαφορετικός από την ετικέτα v2.0.0 καθώς θα περιλαμβάνει και τις καινούριες σας αλλαγές.