Χθες, δημοσίευσα μια ερώτηση σχετικά με το πώς μπορώ να κλωνοποιήσω ένα Git αποθετήριο από ένα από τα μηχανήματά μου σε ένα άλλο, Πώς μπορώ να 'git clone' από ένα άλλο μηχάνημα;.
Τώρα είμαι σε θέση να κλωνοποιήσω με επιτυχία ένα αποθετήριο Git από την πηγή μου (192.168.1.2) στον προορισμό μου (192.168.1.1).
Αλλά όταν έκανα μια επεξεργασία σε ένα αρχείο, ένα git commit -a -m "test"
και ένα git push
, λαμβάνω αυτό το σφάλμα στον προορισμό μου (192.168.1.1):
git push
[email protected]'s password:
Counting objects: 21, done.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (11/11), 1010 bytes, done.
Total 11 (delta 9), reused 0 (delta 0)
error: refusing to update checked out branch: refs/heads/master
error: By default, updating the current branch in a non-bare repository
error: is denied, because it will make the index and work tree inconsistent
error: with what you pushed, and will require 'git reset --hard' to match
error: the work tree to HEAD.
error:
error: You can set 'receive.denyCurrentBranch' configuration variable to
error: 'ignore' or 'warn' in the remote repository to allow pushing into
error: its current branch; however, this is not recommended unless you
error: arranged to update its work tree to match what you pushed in some
error: other way.
error:
error: To squelch this message and still keep the default behaviour, set
error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To git+ssh://[email protected]/media/LINUXDATA/working
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'git+ssh://[email protected]/media/LINUXDATA/working'
Χρησιμοποιώ δύο διαφορετικές εκδόσεις του Git (1.7 στον απομακρυσμένο και 1.5 στον τοπικό υπολογιστή). Είναι αυτός ένας πιθανός λόγος;
Μόλις είχα το ίδιο σφάλμα ενώ άρχισα να μαθαίνω Git. Κάποιες από τις άλλες απαντήσεις είναι σαφές ότι δεν είναι για κάποιον νέο στο Git!
(Θα χρησιμοποιήσω μη τεχνικούς όρους για να περάσω την ιδέα.) Τέλος πάντων, αυτό που συμβαίνει είναι ότι έχετε δύο αποθετήρια, το ένα είναι το αρχικό που φτιάξατε αρχικά και το άλλο το εργασιακό που μόλις φτιάξατε.
Αυτή τη στιγμή βρίσκεστε στο αποθετήριο εργασίας σας και χρησιμοποιείτε τον κλάδο "master". Αλλά τυχαίνει επίσης να είστε "συνδεδεμένοι" στο αρχικό σας αποθετήριο στον ίδιο "master" κλάδο. Τώρα, αφού είστε "συνδεδεμένοι" στο αρχικό, το Git φοβάται ότι μπορεί να τα κάνετε θάλασσα, επειδή μπορεί να εργάζεστε στο αρχικό και να χαλάσετε τα πράγματα. Έτσι, πρέπει να επιστρέψετε στο αρχικό αποθετήριο και να κάνετε ένα "git checkout someotherbranch", και τώρα μπορείτε να προωθήσετε χωρίς προβλήματα.
Ελπίζω αυτό να σας βοηθήσει.
Το μήνυμα σφάλματος περιγράφει τι συνέβη. Οι πιο σύγχρονες εκδόσεις του Git αρνούνται να ενημερώσουν έναν κλάδο μέσω push, αν αυτός ο κλάδος έχει ελεγχθεί.
Ο ευκολότερος τρόπος για να εργαστείτε μεταξύ δύο μη-δεσμευμένων αποθετηρίων είναι είτε να
να ενημερώνετε πάντα τα αποθετήρια μέσω pull (ή fetch and merge) ή, αν χρειαστεί,
προωθώντας σε ένα ξεχωριστό κλάδο (έναν κλάδο εισαγωγής) και στη συνέχεια συγχωνεύοντας αυτόν τον κλάδο με τον κύριο κλάδο στον απομακρυσμένο υπολογιστή.
Ο λόγος για αυτόν τον περιορισμό είναι ότι η λειτουργία push λειτουργεί μόνο στο απομακρυσμένο αποθετήριο Git, δεν έχει πρόσβαση στο ευρετήριο και το δέντρο εργασίας. Έτσι, αν επιτρεπόταν, ένα push στον ελεγχόμενο κλάδο θα άλλαζε το HEAD
ώστε να είναι ασυνεπές με το ευρετήριο και το δέντρο εργασίας στο απομακρυσμένο αποθετήριο.
Αυτό θα καθιστούσε πολύ εύκολο να δεσμευτεί κατά λάθος μια αλλαγή που αναιρεί όλες τις αλλαγές που προωθήθηκαν και επίσης καθιστά πολύ δύσκολο να διακρίνετε μεταξύ τυχόν τοπικών αλλαγών που δεν έχουν δεσμευτεί και των διαφορών μεταξύ του νέου HEAD
, του ευρετηρίου και του δέντρου εργασίας που προκλήθηκαν από την μετακίνηση του HEAD
με push.
Θα πρέπει να κάνετε pushing μόνο σε ένα γυμνό αποθετήριο. Ένα γυμνό αποθετήριο είναι ένα αποθετήριο που δεν έχει ελεγχόμενους κλάδους. Αν πηγαίνατε με cd σε έναν κατάλογο γυμνού αποθετηρίου, θα βλέπατε μόνο τα περιεχόμενα ενός καταλόγου .git.