Git
Chapters ▾ 2nd Edition

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

Δουλεύοντας με απομακρυσμένα αποθετήρια

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

Showing Your Remotes

Για να δείτε τους απομακρυσμένους διακομιστές που έχετε ρυθμίσει, εκτελέστε την εντολή git remote. Η εντολή αυτή θα μας επιστρέψει μια λίστα με τα ονόματα των απομακρυσμένων που έχετε ορίσει. Αν έχετε κλωνοποιήσει το δικό σας αποθετήριο, θα πρέπει να πάρετε σαν αποτέλεσμα το όνομα origin. Αυτό είναι το προεπιλεγμένο όνομα που δίνει το Git στον διακομιστή από τον οποίο μόλις κλωνοποιήσατε:

$ git clone https://github.com/schacon/ticgit
Cloning into 'ticgit'...
remote: Reusing existing pack: 1857, done.
remote: Total 1857 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (1857/1857), 374.35 KiB | 268.00 KiB/s, done.
Resolving deltas: 100% (772/772), done.
Checking connectivity... done.
$ cd ticgit
$ git remote
origin

Μπορείτε επίσης να χρησιμοποιήσετε την επιλογή -v, η οποία θα σας επιστρέψει τα ονόματα των απομακρυσμένων αποθετηρίων σας μαζί με τις διευθύνσεις που είναι συσχετισμένες για εγγραφή και ανάγνωση σε αυτά:

$ git remote -v
origin  https://github.com/schacon/ticgit (fetch)
origin  https://github.com/schacon/ticgit (push)

Αν έχετε περισσότερα απομακρυσμένα, η εντολή αυτή θα τα απαριθμήσει όλα. Για παράδειγμα, αν συνεργάζονται πολλά άτομα σε ένα αποθετήριο τότε μπορεί να έχει και αντίστοιχα πολλά απομακρυσμένα:

$ cd grit
$ git remote -v
bakkdoor  https://github.com/bakkdoor/grit (fetch)
bakkdoor  https://github.com/bakkdoor/grit (push)
cho45     https://github.com/cho45/grit (fetch)
cho45     https://github.com/cho45/grit (push)
defunkt   https://github.com/defunkt/grit (fetch)
defunkt   https://github.com/defunkt/grit (push)
koke      git://github.com/koke/grit.git (fetch)
koke      git://github.com/koke/grit.git (push)
origin    git@github.com:mojombo/grit.git (fetch)
origin    git@github.com:mojombo/grit.git (push)

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

Σημειώστε ότι τα απομακρυσμένα αποθετήρια χρησιμοποιούν μια πληθώρα από πρωτόκολλα. Θα καλύψουμε αναλυτικά τα πρωτόκολλα αυτά στο κεφάλαιο Git on the Server.

Προσθέτοντας απομακρυσμένα αποθετήρια

Πάμε να δούμε λοιπόν πως να προσθέσουμε απομακρυσμένα αποθετήρια πιο αναλυτικά (έχουμε αναφερθεί πιο περιληπτικά σε αυτό σε προηγούμενα κεφάλαια). Για να δώσετε ένα συντομευμένο όνομα στο απομακρυσμένο αποθετήριο ώστε να μπορείτε να αναφέρεστε σε αυτό εύκολα, εκτελέστε την εντολή git remote add [shortname] [url]:

$ git remote
origin
$ git remote add pb https://github.com/paulboone/ticgit
$ git remote -v
origin  https://github.com/schacon/ticgit (fetch)
origin  https://github.com/schacon/ticgit (push)
pb  https://github.com/paulboone/ticgit (fetch)
pb  https://github.com/paulboone/ticgit (push)

Τώρα πλέον μπορείτε να χρησιμοποιείτε στη γραμμή εντολών την συμβολοσειρά pb αντί για ολόκληρη την διεύθυνση του αποθετηρίου. Για παράδειγμα, αν θέλετε να πάρετε όλες τις πληροφορίες που έχει ο Paul στο αποθετήριό του, μπορείτε να εκτελέσετε την εντολή git fetch pb:

$ git fetch pb
remote: Counting objects: 43, done.
remote: Compressing objects: 100% (36/36), done.
remote: Total 43 (delta 10), reused 31 (delta 5)
Unpacking objects: 100% (43/43), done.
From https://github.com/paulboone/ticgit
 * [new branch]      master     -> pb/master
 * [new branch]      ticgit     -> pb/ticgit

Πλέον έχετε πρόσβαση στον κύριο κλάδο του Paul ως pb/master. Μπορείτε να κάνετε διάφορες ενέργειες όπως για παράδειγμα να τον συγχωνεύσετε σε έναν από τους δικούς σας κλάδους, ή να ενημερώσετε έναν τοπικό σας κλάδο. Θα δούμε περισσότερα για τους κλάδους και πως μπορείτε να τους χρησιμοποιήσετε στο κεφάλαιο Διακλαδώσεις στο Git.

Παίρνοντας δεδομένα από απομακρυσμένα αποθετήρια

Όπως μόλις είδαμε, για να πάρουμε δεδομένα από απομακρυσμένα έργα, μπορούμε να εκτελέσουμε:

$ git fetch [remote-name]

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

Αν κλωνοποιήσετε ένα αποθετήριο, ουσιαστικά το αποθηκεύετε με το όνομα “origin”. Οπότε, η εντολή git fetch origin θα τραβήξει όλες τις νέες αλλαγές που έχουν γίνει από τότε που κλωνοποιήσατε το αποθετήριο ή τραβήξατε δεδομένα για τελευταία φορά από αυτό. Είναι σημαντικό να τονίσουμε ότι η εντολή git fetch τραβάει δεδομένα στο τοπικό σας αποθετήριο. Η εντολή αυτή δεν συγχωνεύει τα δεδομένα αυτά με διάφορες αλλαγές που μπορεί να έχετε κάνει εσείς τοπικά. Για αυτό, θα πρέπει να κάνετε την συγχώνευση χειροκίνητα όταν είσαστε εσείς έτοιμοι

Αν έχετε δημιουργήσει έναν κλάδο για να παρακολουθείτε έναν απομακρυσμένα κλάδο (περισσότερες λεπτομέρειες για αυτό στο επόμενο κεφάλαιο, Διακλαδώσεις στο Git), μπορείτε να χρησιμοποιήσετε την εντολή git pull. Η εντολή αυτή θα πάρει έναν απομακρυσμένο κλάδο και θα τον συγχωνεύσει αυτόματα στον τρέχοντα κλάδο σας. Αυτή η ροή εργασιών είναι γενικά πιο εύκολη για εσάς. Η εντολή git clone θέτει αυτόματα τον τοπικό σας κύριο κλάδο να παρακολουθεί τις αλλαγές το απομακρυσμένου κύριου κλάδου (ή όπως έχετε ονομάσει τον προεπιλεγμένο σας κλάδο). Εκτελώντας έπειτα την εντολή git pull, τραβάτε δεδομένα από τον διακομιστή που αρχικά είχατε κλωνοποιήσει, και συγχωνεύετε τα δεδομένα αυτά με τον κώδικα στον οποίο δουλεύετε.

Ώθηση δεδομένων σε απομακρυσμένα αποθετήρια

Όταν έχετε κάποιο έργο στο οποίο έχετε κάνει αλλαγές και το έχετε φτάσει σε σημείο που θέλετε να το κοινοποιήσσετε, θα πρέπει να το ωθήσετε. Η εντολή είναι απλή: git push [remote-name] [branch-name]. Αν θέλετε για παράδειγμα να ωθήσετε τον τοπικό σας κύριο κλάδο στον απομακρυσμένο διακομιστή origin (η εντολή κλωνοποίησης ενός αποθετηρίου μας βοηθάει για να έχουμε ρυθμισμένα σωστά τα ονόματα αυτά), θα πρέπει να εκτελέσετε την εντολή αυτή έτσι ώστε να στείλετε όσες υποβολές έχετε κάνει πίσω στον διακομιστή:

$ git push origin master

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

Εξετάζοντας ένα απομακρυσμένο αποθετήριο

Αν θέλετε να δείτε περισσότερες πληροφορίες σχετικά με ένα απoμακρυσμένο αποθετήριο, μπορείτε να χρησιμοποιήσετε την εντολή git remote show [remote-name]. Αν για παράδειγμα εκτελέσουμε την εντολή αυτή για ένα αποθετήριο με το συντομευμένο όνομα origin, θα δούμε ως αποτέλεσμα:

$ git remote show origin
* remote origin
  Fetch URL: https://github.com/schacon/ticgit
  Push  URL: https://github.com/schacon/ticgit
  HEAD branch: master
  Remote branches:
    master                               tracked
    dev-branch                           tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

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

Το παραπάνω είναι ένα απλό παράδειγμα που μπορεί να συναντήσετε. Όταν αρχίσετε να χρησιμοποιείτε πιο εκτεταμένα το Git, μπορεί να δείτε πολύ περισσότερες πληροφορίες με την εντολή git remote show, για παράδειγμα:

$ git remote show origin
* remote origin
  URL: https://github.com/my-org/complex-project
  Fetch URL: https://github.com/my-org/complex-project
  Push  URL: https://github.com/my-org/complex-project
  HEAD branch: master
  Remote branches:
    master                           tracked
    dev-branch                       tracked
    markdown-strip                   tracked
    issue-43                         new (next fetch will store in remotes/origin)
    issue-45                         new (next fetch will store in remotes/origin)
    refs/remotes/origin/issue-11     stale (use 'git remote prune' to remove)
  Local branches configured for 'git pull':
    dev-branch merges with remote dev-branch
    master     merges with remote master
  Local refs configured for 'git push':
    dev-branch                     pushes to dev-branch                     (up to date)
    markdown-strip                 pushes to markdown-strip                 (up to date)
    master                         pushes to master                         (up to date)

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

Αφαιρώντας και μετονομάζοντας απομακρυσμένα αποθετήρια

Αν θέλετε να μετονομάσετε την αναφορά που έχετε σε ένα απομακρυσμένο αποθετήριο, εκτελέστε την εντολή git remote rename ώστε να αλλάξετε το συντομευμένο όνομά του. Για παράδειγμα, αν θέλετε να μετονομάσετε το pb σε paul, μπορείτε να εκτελέσετε git remote rename:

$ git remote rename pb paul
$ git remote
origin
paul

Αξίζει να σημειώσουμε ότι η εντολή αυτή αλλάζει επίσης και τα ονόματα των απομακρυσμένων κλάδων. Για παράδειγμα, ένας κλάδος που αναφερόταν ως pb/master πλέον θα αναφέρεται ως paul/master.

Μπορεί επίσης για κάποιο λόγο να θέλετε να διαγράψετε ένα απομακρυσμένο αποθετήριο. Για παράδειγμα, μπορεί να έχετε μετακινήσει τον διακομιστή σε άλλη διεύθυνση, ή να μην χρησιμοποιείτε το συγκεκριμένο αποθετήριο, ή απλά να μην θέλετε να συνεισφέρετε πλέον σε αυτό. Σε αυτή την περίπτωση μπορείτε να χρησιμοποιήσετε την εντολή git remote rm:

$ git remote rm paul
$ git remote
origin