web-dev-qa-db-fra.com

git refusant d'aller chercher dans la branche actuelle

J'ai mis en place un référentiel distant et je peux y introduire de nouvelles modifications, mais je ne peux pas le récupérer, je reçois toujours le message d'erreur (plutôt cryptique):

fatal: Refusing to fetch into current branch refs/heads/master of non-bare repository
fatal: The remote end hung up unexpectedly

Qu'est-ce que ça veut dire? Que dois-je faire pour activer la récupération?

(Notez que ce référentiel distant n'est utilisé que comme un référentiel de sauvegarde, il devrait donc être à peu près une copie exacte de mon référentiel local. Je ne comprends vraiment pas pourquoi je peux y pousser mais pas le récupérer ...)

Ma config ressemble à:

[remote "Origin"]
    url = ssh://blablablah
    fetch = +refs/*:refs/*
    mirror = true
56
Olivier Verdier

Ce que vous essayez de faire est de récupérer la branche sur laquelle vous travaillez. Autrement dit, vous êtes sur la branche principale et vous essayez de la mettre à jour. Ce n'est pas possible. Il est plus courant de mettre à jour le remotes/* branches, puis tirez-la dans vos branches locales. Ce que vous voulez, c'est peut-être

git remote add otherrepo thehost:/the/path.git

Cela configurera le référentiel à récupérer dans remotes/otherrepo/*. git fetch otherrepo devrait faire l'affaire. Alternativeley, vous pouvez modifier manuellement votre .git/config et définissez fetch pour la télécommande sur quelque chose comme refs/heads/*:refs/remotes/otherrepo/*.

31

Dans le cas où quelqu'un trouverait cela parce qu'il veut spécifiquement aller chercher dans la branche courante, vous pouvez utiliser le --update-head-ok drapeau. De les docs :

-u
- update-head-ok
Par défaut, git fetch refuse de mettre à jour la tête qui correspond à la branche courante. Ce drapeau désactive la vérification. Ceci est purement destiné à l'usage interne de git pull pour communiquer avec git fetch, et sauf si vous implémentez votre propre porcelaine, vous n'êtes pas censé l'utiliser.

Dans certains cas, nous souhaitons implémenter nos propres commandes porcelaine, par exemple, l'automatisation et l'outillage.

51
RobW

Cela devrait également fonctionner si vous êtes dans la branche master et que vous souhaitez obtenir la dernière version, essayez ceci

git pull Origin master

5
Sai

J'ai eu ce problème lorsque j'ai cloné un référentiel sans réfléchir au lieu de le récupérer, de sorte que les deux référentiels étaient maîtres. Si vous n'avez effectué aucun travail sur le référentiel distant, vous pouvez corriger les problèmes avec les commandes de base de git comme suit: (1) supprimer le référentiel distant, (2) copier le référentiel local là où se trouvait le référentiel distant, (3) supprimer le local, puis (4) configurer le référentiel local en utilisant

git init; git fetch $REMOTE_GIT_REPOSITORY_URL  

Alors git pull et git Push fera les bonnes choses. L'avantage d'éviter git remote, selon la réponse plus efficace et plus raisonnée de Michael, c'est que vous n'avez pas besoin de penser à la sémantique du suivi des branches.

1
Charles Stewart

fatal: refus de récupérer dans les références/têtes de branche/BRANCHNAME actuelles du référentiel non nu

J'ai créé une branche BRANCHNAME localement puis exécuté la commande "git fetch pull up amont/ID/head: BRANCHNAME" et j'ai obtenu fatal: Refus de récupérer dans les branches/références/head/BRANCHNAME de non -bare repository

puis j'ai supprimé la branche et appeler à nouveau le même cmd, il va bien.

En fait, je vérifiais la branche de demande de pull.

0
Adit choudhary

Êtes-vous en train de taper des commandes Git dans la ligne de commande, ou exécutez-vous l'exécutable Git à partir de votre propre code?
Si vous l'exécutez à partir du code, êtes-vous sûr que Git essaie de récupérer dans le bon répertoire local?

Il existe deux façons possibles de procéder:

  1. Utilisez les options fournies par votre langage de programmation pour définir le répertoire de travail correct avant d'exécuter Git
    ( exemple C # , car c'est ce que j'utilise)

  2. Toujours passer le -C paramètre à Git pour spécifier le répertoire avec le dépôt local.


J'ai un projet où j'appelle l'exécutable Git à partir du code C #, et j'ai reçu le même message d'erreur que dans la question lorsque j'ai accidentellement oublié de définir le -C parameter.

0
Christian Specht