255 votes

Erreur Git Push : refus de mettre à jour la branche extraite

J'ai résolu quelques conflits de fusion, commis puis essayé de pousser mes changements et reçu l'erreur suivante :

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'

Quelqu'un sait-il ce qui pourrait causer cette erreur ?

3 votes

10 votes

En fait, vous disposez maintenant d'un moyen sûr de pousser vers un dépôt non nu avec Git 2.3.0 (février 2015) et git config receive.denyCurrentBranch=updateInstead : stackoverflow.com/a/‌​28262104/6309

0 votes

304voto

Shahbaz Points 22525

Raison : Vous poussez vers un référentiel non nu.

Il existe deux types de référentiels : nus et non nus

Les dépôts nus n'ont pas de copie de travail et vous pouvez pousser vers eux. Ce sont les types de dépôts que vous obtenez dans Github ! Si vous voulez créer un dépôt nu, vous pouvez utiliser

git init --bare

Donc, en résumé, vous ne pouvez pas pousser vers un dépôt non dénudé (Edit : Eh bien, vous ne pouvez pas pousser vers la branche actuellement vérifiée d'un dépôt. Avec un dépôt nu, vous pouvez pousser vers n'importe quelle branche puisqu'aucune n'est vérifiée. Bien que possible, pousser vers des dépôts non nus n'est pas courant). Ce que vous pouvez faire, c'est récupérer et fusionner depuis l'autre dépôt. C'est ainsi que le pull request que vous pouvez voir sur Github fonctionne. Vous leur demandez de tirer de vous, et vous ne leur imposez pas de force.


Mise à jour : Merci à VonC d'avoir signalé ce problème, dans les dernières versions git (actuellement 2.3.0), Pousser vers la branche vérifiée d'un dépôt non nu est possible. . Néanmoins, vous ne pouvez toujours pas pousser vers un sale arbre de travail, ce qui n'est pas une opération sûre de toute façon.

1 votes

Oui ! C'est correct, merci ! Comme j'ai un million de choses à faire, j'ai accidentellement cloné le répertoire de travail....doh !

36 votes

En fait, vous pouvez pousser vers un dépôt non dénudé sans problème, vous ne pouvez pas pousser vers la branche qui est actuellement vérifié .

0 votes

@Nowhereman, cela a du sens. Mais néanmoins, soit vous avez une configuration distante juste pour pousser, que vous feriez nue de toute façon, soit c'est le clone de travail de quelqu'un, dont vous ne savez pas laquelle de ses branches est extraite, et dans tous les cas ce n'est pas bien de pousser vers le dépôt de travail de quelqu'un (ils peuvent être au milieu de quelque chose impliquant cette branche). Merci pour la clarification.

147voto

Sasha Pachev Points 61

J'ai résolu ce problème en vérifiant d'abord que la télécommande n'avait rien de vérifié (elle n'était vraiment pas censée le faire), puis en la rendant nue :

$ git config --bool core.bare true

Après cela, git push a fonctionné correctement.

4 votes

C'est le correctif en une ligne que je cherchais mais il faudrait peut-être expliquer les dépôts nus et non nus comme dans la réponse de @shahbaz.

0 votes

Cela permettra à l'historique des changements d'être poussé, mais ces changements ne seront pas reflétés dans le repo non-bare.

0 votes

Allez-vous git config core.bare false et git reset --hard ?

55voto

Nowhere man Points 2762

Résumé

Vous ne pouvez pas pousser vers la seule branche extraite d'un dépôt parce que cela perturberait l'utilisateur de ce dépôt d'une manière qui se terminera très probablement par la perte de données et d'historique . Mais vous pouvez pousser vers n'importe quelle autre branche du même dépôt.

Comme les dépôts nus n'ont jamais de branches extraites, vous pouvez toujours pousser vers n'importe quelle branche d'un dépôt nu.

Autopsie du problème

Lorsqu'une branche est extraite, le commit ajoutera un nouveau commit avec la tête de la branche actuelle comme parent et déplacera la tête de la branche pour être ce nouveau commit.

Alors

A  B

[HEAD,branch1]

devient

A  B  C

    [HEAD,branch1]

Mais si quelqu'un pouvait pousser sur cette branche entre les deux, l'utilisateur se retrouverait dans ce que git appelle tête détachée mode :

A  B  X

[HEAD] [branch1]

Maintenant, l'utilisateur n'est plus dans la branche 1, sans avoir demandé explicitement de vérifier une autre branche. Pire, l'utilisateur est maintenant en dehors de toute branche et tout nouveau commit sera simplement dangling :

      [HEAD]

        C

A  B  X

       [branch1]

Hypothétiquement, si à ce moment-là, l'utilisateur vérifie une autre branche, alors ce commit en suspens devient un jeu d'enfant pour l'outil Git éboueur .

0 votes

Je me suis un peu étendu dans stackoverflow.com/questions/2816369/

15voto

kenorb Points 2464

TLDR

  1. Tirez et poussez encore : git pull &&& git push .
  2. Toujours un problème ? Poussez dans une autre branche : git push origin master:foo et le fusionner sur le dépôt distant.
  3. On peut aussi forcer la poussée en ajoutant -f ( denyCurrentBranch doit être ignorée).

En fait, l'erreur signifie que votre dépôt n'est pas à jour avec le code distant (son index et son arbre de travail sont incompatibles avec ce que vous avez poussé).

Normalement, vous devez pull pour obtenir les dernières modifications et push encore une fois.

Si cela n'aide pas, essayez de pousser dans une autre branche, par exemple :

git push origin master:foo

puis fusionner cette branche sur le référentiel distant avec master.

Si vous avez modifié intentionnellement certains commits passés via git rebase et que vous voulez remplacer le repo par vos changements, vous voudrez probablement forcer le push en ajoutant -f / --force (non recommandé si vous n'avez pas fait de rebase ). Si cela ne fonctionne toujours pas, vous devez définir les paramètres suivants receive.denyCurrentBranch à ignore à distance comme suggéré par un message git via :

git config receive.denyCurrentBranch ignore

0 votes

Pousser une branche au lieu de vers master a fonctionné pour moi. J'ai demandé à mon serveur local de récupérer un dépôt git distant et je l'ai récupéré sur le serveur local. Je suis d'accord pour fusionner ma branche vers master sur le serveur et ensuite la pousser. +1

3voto

jacky Points 129

Peut-être que votre repo distant est dans la branche que vous voulez pousser. Vous pouvez essayer de vérifier une autre branche dans votre machine distante. J'ai fait cela, que ces erreurs ont disparu, et j'ai poussé avec succès à mon repo distant. Notez que j'utilise ssh pour connecter mon propre serveur au lieu de github.com.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X