Gisteren heb ik een vraag gepost over hoe een Git repository te klonen van een van mijn machines naar een andere, Hoe kan ik 'git clone' vanaf een andere machine?.
Ik ben nu in staat om met succes een Git repository te clonen van mijn bron (192.168.1.2) naar mijn bestemming (192.168.1.1).
Maar toen ik een bestand wijzigde, een git commit -a -m "test"
en een git push
deed, kreeg ik deze foutmelding op mijn bestemming (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'
Ik'gebruik twee verschillende versies van Git (1.7 op de remote en 1.5 op de lokale machine). Is dat een mogelijke reden?
Ik had net dezelfde fout toen ik Git begon te leren. Sommige van de andere antwoorden zijn duidelijk niet voor iemand die nieuw is met Git!
(Ik ga niet-technische termen gebruiken om het idee over te brengen.) Hoe dan ook, wat er gebeurt is dat je twee repositories hebt, een is het origineel dat je eerst gemaakt hebt, en de andere is het werk dat je net gemaakt hebt.
Op dit moment zit je in je werk repository en gebruik je de "master" branch. Maar je bent toevallig ook ingelogd in je originele repository op dezelfde master branch. Nu, omdat je "ingelogd bent" in het origineel, vreest Git dat je het zou kunnen verknoeien omdat je misschien in het origineel aan het werken bent en de dingen verknoeit. Dus moet je terugkeren naar het originele repository en een "git checkout someotherbranch" doen, en nu kun je pushen zonder problemen.
Ik hoop dat dit helpt.
De foutmelding beschrijft wat er gebeurd is. Modernere versies van Git weigeren om een branch via een push bij te werken als die branch uitgecheckt is.
De makkelijkste manier om tussen twee niet-gecheckte repositories te werken is om ofwel
de repositories altijd via pull (of fetch en merge) te verversen of, als het moet,
door te pushen naar een aparte branch (een import branch) en dan die branch samen te voegen in de master branch op de remote machine.
De reden voor deze beperking is dat de push operatie alleen op het remote Git repository werkt, het heeft geen toegang tot de index en werkboom. Dus, als het toegestaan is, zou een push op de uitgecheckte branch de HEAD
veranderen om inconsistent te zijn met de index en werkboom op het remote repository.
Dit zou het erg makkelijk maken om per ongeluk een wijziging vast te leggen die alle gepushte wijzigingen ongedaan maakt en maakt het ook erg moeilijk om onderscheid te maken tussen lokale wijzigingen die niet zijn vastgelegd en verschillen tussen de nieuwe HEAD
, de index en de werkboom die zijn veroorzaakt door het pushen van HEAD
.