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). Είναι γενικά προτιμώμενο να χρησιμοποιούμε ετικέτες με επισημειώσεις (annotations) έτσι ώστε να έχουμε όλη αυτήν την πληροφορία. Παρόλα αυτά, αν για κάποιο λόγο θέλουμε να χρησιμοποιήσουμε μια ετικέτα χωρίς περαιτέρω πληροφορίες για αυτήν, μπορούμε να χρησιμοποιήσουμε τις ελαφριές ετικέτες.

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

Η δημιουργία μιας ετικέτας με επισημειώσεις είναι απλή. Ο ευκολότερος τρόπος είναι να χρησιμοποιήσουμε την επιλογή -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

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

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

Ένας άλλος τρόπος για να βάλουμε ετικέτες στις υποβολές είναι οι ελαφρείς ετικέτες. Η ετικέτα δεν περιλαμβάνει καμία περαιτέρω πληροφορία εκτός από το άθροισμα ελέγχου της υποβολής μας. Για να δημιουργήσουμε μια τέτοια ετικέτα, θα πρέπει να μην χρησιμοποιήσουμε τις επιλογές -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. Μπορούμε να βάλουμε την ετικέτα όποτε θέλουμε. Για να το κάνουμε αυτό, θα πρέπει να προσδιορίσουμε το άθροισμα ελέγχου της υποβολής μας (ή ένα μέρος του) στο τέλος της εντολής:

$ 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 καθώς θα περιλαμβάνει και τις καινούριες μας αλλαγές.