Git Push erreur: le refus de la mise à jour extrait de la branche
J'ai pu résoudre certains conflits de fusion, commis alors tenté de Repousser mes modifications et a reçu le message d'erreur suivant:
c:\Program Files (x86)\Git\bin\git.exe push --recurse-submodules=check "origin" master:master
Done
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error:
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error:
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To C:/Development/GIT_Repo/Project
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'C:/Development/GIT_Repo/Project'
Personne ne sait ce qui pourrait être la cause de cette erreur?
- dupliqué: stackoverflow.com/questions/2816369/...
- En fait vous maintenant de s'assurer un moyen de pousser à un non-nue repo avec Git 2.3.0 (février 2015) et
git config receive.denyCurrentBranch=updateInstead
:stackoverflow.com/a/28262104/6309 - Double Possible de Git push erreur " [remote rejeté] maître -> master (branche est actuellement vérifié)'
Vous devez vous connecter pour publier un commentaire.
Il existe deux types de référentiels: nu et non nu
Nu référentiels de ne pas avoir une copie de travail et vous pouvez pousser à eux. Ce sont les types de dépôts que vous obtenez dans Github! Si vous souhaitez créer un dépôt nu, vous pouvez utiliser
Donc, en bref, vous ne pouvez pas pousser à un non-dépôt nu(Edit: eh Bien, vous ne pouvez pas pousser à la sorti de la branche d'un référentiel. Avec un dépôt nu, vous pouvez appuyer sur n'importe quelle branche car aucun sont extraits. Bien que possible, pousser à non à nu des référentiels n'est pas commun). Ce que vous pouvez faire est de récupérer et fusionner de l'autre référentiel. De cette façon, lepull request
que vous pouvez voir sur Github œuvres. Vous leur demandez de tirer de vous, et vous n'avez pas la force de pousser dans leur.Mise à jour: Grâce à VonC de souligner ce point, dans les dernières versions git (actuellement 2.3.0), en poussant à l'extrait d'une branche de non-dépôt nu est possible. Néanmoins, vous ne peut pas pousser à une sale arbre de travail, ce qui n'est pas un fonctionnement sûr de toute façon.
git config receive.denyCurrentBranch=updateInstead
:stackoverflow.com/a/28262104/6309--bare
mais encore il est la production même erreur. Que dois-je faire...? Ma télécommande repo est nu.git remote show origin
). Si vous êtes sûr que votre télécommande est nue, mais git se plaint toujours qu'il n'est pas nu, essayez de demander à une autre question, comme il peut être un bug. Y compris votre version git ainsi.bare=false
?J'ai résolu ce problème en vérifiant d'abord la distance n'a rien vérifié (il n'était vraiment pas censé), puis mis à nu avec:
Après que la commande git push a bien fonctionné.
Résumé
Vous ne pouvez pas repousser à un extrait de la branche d'un dépôt, car ce serait gâcher l'utilisateur de ce référentiel dans une manière qui sera très probablement finir avec perte de données et de l'histoire. Mais vous pouvez pousser à une autre branche de la même référentiel.
Comme nues dépôts n'ont jamais de la branche d'extraction, vous pouvez toujours pousser à la branche d'un dépôt nu.
De l'autopsie du problème
Lorsqu'une branche est cochée, remettant va ajouter un nouveau commit avec l'actuelle direction de la tête de sa mère et déplacer la branche de la tête que nouveau commit.
Donc
devient
Mais si quelqu'un pouvait pousser vers cette branche dans l'intervalle, l'utilisateur obtiendrait d'elle-même dans ce que git appels détaché de la tête mode:
Maintenant, l'utilisateur n'est pas dans branch1 plus, sans l'avoir explicitement demandé de vérifier d'une autre branche. Pire, l'utilisateur est maintenant en dehors de toute branche, et tout nouveau commit sera juste balançant:
Hypothétiquement, si, à ce stade, l'utilisateur vérifie une autre branche, puis cette balançant commettre devient un jeu équitable pour Git est garbage collector.
cd sur le repo/répertoire que vous êtes en poussant sur la machine distante et entrez
Pour moi, la suite fait le tour:
git config --global receive.denyCurrentBranch updateInstead
J'ai configuré le lecteur F:, presque dans son intégralité, la synchronisation entre mon Windows 10 de bureau et mon Windows 10 pour ordinateur portable, à l'aide de Git. J'ai fini par l'exécution de la commande ci-dessus sur les deux machines.
D'abord j'ai partagé le bureau du F disque dur sur le réseau. Ensuite, j'ai été en mesure de le cloner sur mon ordinateur portable, en cours d'exécution:
F:
git clone 'file://///DESKTOP-PC/f'
Malheureusement, tous les fichiers s'est retrouvée sous "F:\ \ f\ \" sur mon portable, pas dans F:\ directement. Mais j'ai été capable de couper et de coller manuellement. Git toujours travaillé à partir de la nouvelle position par la suite.
Ensuite, j'ai essayé de faire quelques changements à des fichiers sur l'ordinateur portable, de les commettre, et de les pousser vers le bureau. Qui n'a pas fonctionné jusqu'à ce que j'ai exécuté la commande git config mentionnés ci-dessus.
Remarque que j'ai couru toutes ces commandes à partir de Windows PowerShell, sur les deux machines.
Mise à JOUR: j'ai toujours eu des problèmes de pousser des changements, dans certains cas. J'ai finalement juste commencé à tirer les changements au lieu de cela, en exécutant les opérations suivantes sur l'ordinateur que je veux tirer le dernier commit(s) à:
git pull --all --prune
Comme il y a déjà un référentiel existant, l'exécution de
sur le dépôt distant devrait suffire
De base.nu documentation
Si la valeur est true (nu = true), le référentiel est supposé être nue avec pas de répertoire de travail associé. Si c'est le cas d'un certain nombre de commandes qui nécessitent un répertoire de travail sera désactivé, tel que git-ajouter ou git-fusion (mais vous serez en mesure de pousser à elle).
Ce paramètre est automatiquement deviné par git-clone ou git-init lorsque le référentiel est créé. Par défaut, un référentiel qui se termine par "/.git" est supposé ne pas être nu (nu = false), alors que tous les autres dépôts sont supposés être nu (nu = true).
TLDR
git pull &&& git push
.git push origin master:foo
et fusionner sur la télécommande repo.-f
(denyCurrentBranch
doit être ignoré).Fondamentalement l'erreur signifie que le référentiel n'est pas à jour avec le code à distance (son index et le travail de l'arbre est contradictoire avec ce que vous avez poussé).
Normalement, vous devriez
pull
premier à obtenir les modifications récentes etpush
de nouveau.Si ne va pas aider, essayer de pousser dans une autre branche, par exemple:
puis de fusionner cette branche sur le dépôt distant de retour avec le maître.
Si vous avez modifié certaines passé commet intentionnellement par
git rebase
et vous voulez remplacer le repo avec vos modifications, vous voulez probablement à force de le pousser par l'ajout de-f
/--force
paramètre (pas recommandé si vous n'avez pasrebase
). Si ne fonctionne toujours pas, vous devez définirreceive.denyCurrentBranch
àignore
sur la télécommande comme l'a suggéré un git message par:Peut-être votre télécommande repo est dans la direction où vous voulez aller. Vous pouvez essayer de commander un autre succursale dans votre machine à distance. Je l'ai fait, que ces erreur a disparu, et j'ai poussé la réussite de ma télécommande repo. Notez que j'utilise ssh pour se connecter mon propre serveur à la place de github.com.
Je a cette erreur, parce que le repo git a (accidentellement) initialisé deux fois sur le même emplacement : d'abord comme un non-nue repo et peu de temps après en tant que nu repo. Parce que l' .git dossier reste, git suppose le dépôt est non-nus. Retrait de l' .git dossier de travail et les données de l'annuaire a résolu le problème.
.git
dossier sur la distance m'a permis de pousser la première validation.