106 votes

Git refuse de récupérer dans la branche actuelle

J'ai mis en place un dépôt distant et je peux pousser de nouveaux changements vers celui-ci, mais je ne peux pas récupérer à partir de celui-ci, je reçois toujours le message d'erreur (plutôt cryptique) :

fatal: Refuser de récupérer dans la branche actuelle refs/heads/master d'un dépôt non nu
fatal: La fin distante a fermé la connexion de manière inattendue

Que cela signifie-t-il ? Que dois-je faire pour activer la récupération ?

(Notez que ce dépôt distant est uniquement utilisé comme sauvegarde, donc il devrait être une copie exacte de mon dépôt local. Je ne comprends vraiment pas pourquoi je peux pousser vers lui mais pas récupérer à partir de lui...)

Ma configuration ressemble à ceci :

[remote "origin"]
    url = ssh://blablablah
    fetch = +refs/*:refs/*
    mirror = true

100voto

RobW Points 2202

Si quelqu'un trouve ceci car il souhaite spécifiquement récupérer dans la branche actuelle, vous pouvez utiliser le drapeau --update-head-ok. Depuis la documentation :

-u
--update-head-ok
Par défaut, git fetch refuse de mettre à jour la tête qui correspond à la branche actuelle. Ce drapeau désactive la vérification. Cela est uniquement destiné à un usage interne pour que git pull communique avec git fetch, et à moins que vous n'implémentiez votre propre Porcelaine, vous n'êtes pas censé l'utiliser.

Dans certains cas, nous voulons en effet implémenter nos propres commandes en porcelaine, par exemple pour l'automatisation et les outils.

52voto

Ce que vous essayez de faire est de récupérer la branche sur laquelle vous travaillez. En d'autres termes, 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 les branches remotes/* et ensuite de les tirer dans vos branches locales. Ce que vous voulez faire est, peut-être,

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

Cela configurera le dépôt à récupérer dans remotes/otherrepo/*. git fetch otherrepo devrait faire l'affaire. Alternativement, vous pouvez modifier manuellement votre .git/config et définir fetch pour le dépôt distant sur quelque chose comme refs/heads/*:refs/remotes/otherrepo/*.

13voto

Learning Bee Points 65

Aussi cela fonctionnera si vous êtes dans la branche master et souhaitez obtenir la dernière version, essayez ceci

git pull origin master

5voto

roshnet Points 52

Pour remédier à cela lors de la récupération d'une PR pour la tester en local, il suffit de basculer sur une autre branche puis de récupérer la PR.

git checkout -b feature-branch # créer une branche pour récupérer les modifications.
git checkout master # ou main
git fetch origin pull/5/head:add-feature # récupérer la pull request par ID
git checkout feature-branch

2voto

VonC Points 414372

Notez que ce message d'erreur ne s'appliquera pas uniquement à votre branche actuelle, mais à toute branche vérifiée en tant que worktree.

"git fetch"(man) sans l'option --update-head-ok devrait protéger une branche vérifiée contre les mises à jour, afin d'empêcher l'arborescence de travail qui la vérifie de se désynchroniser.

Le code était écrit avant l'utilisation de "git worktree"(man) n'est devenue courante, et vérifiait uniquement la branche vérifiée dans l'arborescence de travail actuelle, qui a été mise à jour avec Git 2.35 (T1 2022).

Voir commit 593a2a5, commit 9fdf4f1, commit 38baae6, commit 8bc1f39, commit c8dd491, commit 7435e7e, commit c25edee, commit 66996be (01 décembre 2021) par Anders Kaseorg (andersk).
(Fusionné par Junio C Hamano -- gitster -- dans commit 13fa77b, 21 décembre 2021)

fetch: protéger les branches vérifiées dans toutes les arbres de travail

Signé par : Anders Kaseorg

Refuser de récupérer dans la branche actuellement vérifiée de n'importe quelle arborescence de travail, pas seulement celle en cours.

Résout ce bug précédemment signalé.

Comme effet secondaire de l'utilisation de find_shared_symref, nous refuserons également la récupération lorsque nous sommes sur un HEAD détaché car nous sommes en train de rebaser ou de bisecter sur la branche en question.
Cela semble être un changement sensé.


Avec Git 2.37 (T3 2022), la façon dont "git fetch"(man) sans --update-head-ok garantit que HEAD dans aucune arborescence de travail ne pointe vers une référence en cours de mise à jour était trop gaspillée, ce qui a été optimisé un peu.

Voir commit f7400da (16 mai 2022) par Orgad Shaneh (orgads).
(Fusionné par Junio C Hamano -- gitster -- dans commit 5ed49a7, 25 mai 2022)

fetch: limiter la vérification partagée des symboles seulement pour les branches locales

Signé par : Orgad Shaneh

Cette vérification a été introduite dans 8ee5d73 ("Corriger la récupération/tirage lorsqu'elle est exécutée sans --update-head-ok", 2008-10-13, Git v1.6.1-rc1 -- fusion) afin de se protéger contre le remplacement de la référence de la branche active par erreur, par exemple en exécutant git fetch origin master:master(man) .

(voir "Pourquoi "git fetch origin branch:branch" fonctionne uniquement sur une branche non courante ?")

Cela a ensuite été étendu dans 8bc1f39 ("fetch: protéger les branches vérifiées dans toutes les arbres de travail", 2021-12-01, Git v2.35.0-rc0 -- fusion listée dans batch #4) pour analyser toutes les arbres de travail.

Cette opération est très coûteuse (prend environ 30s dans mon dépôt) lorsque qu'il y a de nombreuses étiquettes ou branches, et elle est exécutée à chaque récupération, même si aucune tête locale n'est mise à jour du tout.

Limitez-la pour protéger uniquement refs/heads/* afin d'améliorer les performances de la récupération.

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