Git fatal: la référence a un format invalide: 'refs / heads / master

101

J'utilise Dropboxpour synchroniser un gitréférentiel, mais maintenant, lorsque j'essaye et pushque j'obtiens une erreur:

fatal: Reference has invalid format: 'refs/heads/master (MacBook-Pro's conflicted copy 2012-10-07)'

Il semble donc que Dropbox ait détecté un conflit et créé une copie. Ok, pas de problème, j'ai donc supprimé le fichier en conflit. Pourtant, obtenir l'erreur git ci-dessus.

$ git checkout master
    M   index.html
    Already on 'master'
$ git add .
$ git commit -a -m "Cleanup repo"
    [master ff6f817] Cleanup repo
    1 file changed, 5 insertions(+), 5 deletions(-)
$ git push
    fatal: Reference has invalid format: 'refs/heads/master (MacBook-Pro's conflicted copy 2012-10-07)'
    The remote end hung up unexpectedly`

Comment puis-je réparer cela? Merci.

Justin
la source

Réponses:

178

faites une sauvegarde de votre dépôt si vous n'êtes pas sûr de celui-ci, car ces commandes sont irréversibles.

tout d'abord, allez dans votre répertoire repo.

cd myrepo

puis recherchez récursivement les fichiers en conflit et supprimez-les

find . -type f -name "* conflicted copy*" -exec rm -f {} \;

enfin, supprimez toutes les références "en conflit" du fichier compressé-refs de git

awk '!/conflicted/' .git/packed-refs > temp && mv temp .git/packed-refs
voie
la source
1
J'ai eu le même problème et cela l'a résolu pour moi. Je vous remercie!
erik
Cela a réglé le problème pour moi aussi. Je vous remercie!
cecconeurale
1
pour les utilisateurs de macosfind . -type f -name "* conflicted copy*" -delete
Soyoes
42

Le fichier en conflit pourrait se trouver à plusieurs endroits, je voudrais examiner:

.git/logs/refs/remotes/origin/
.git/logs/refs/heads/
.git/refs/remotes/origin/
.git/refs/heads/

Ou vous pourriez chercher partout dans le .gitsous - répertoire:find . -name '*conflicted*'

Ou, sinon, listez les branches actives avec git branch -aet supprimez ( git branch -d) tout ce qui est suspect.

Marco Leogrande
la source
Il y a des fichiers en conflit partout à l'intérieur de .git. Je les ai tous supprimés, et c'est corrigé. Merci.
Justin
2
@Justin Content que je puisse aider. Si cette réponse ou toute autre a résolu votre problème, veuillez la marquer comme acceptée.
Marco Leogrande
2
Sur Mac OS X, utilisez: find . -name '*conflicted*'(Edit: format)
xgMz
1
@xgMz Merci, je mettrai à jour ma réponse, car votre solution a une validité générale.
Marco Leogrande
1
Avec un simple, findj'ai mis la main sur un seul fichier en conflit et j'ai résolu manuellement le problème avec deux mv. Faire cela lentement et raisonner étape par étape est la voie la plus sûre.
pid
8

Cela arrive également à notre équipe lorsque mon collègue applique ses modifications et arrête le PC avant que Dropbox ne soit mis à jour.

Je l'ai résolu si simplement.

Je viens de supprimer la copie en conflit. (Copie en conflit de XXXX aaaa-mm-jj)

Et tirez-le normalement.

Notez que mon collègue avait des changements avant gâchés. Et il a poussé à nouveau ses changements. Cette fois pas d'arrêt. :)

Hareen Laks
la source
1
a fonctionné absolument parfait pour moi :) thx - pour moi dropbox a créé un nom de fichier de chaîne étrange qui n'était pas compatible avec "mise à jour"
cV2
1
Cela a fonctionné pour moi! Il y avait un fichier avec "copie en conflit" dans le nom dans le dossier / refs / heads et le supprimant, puis tirez / push et tout va bien. Merci!
DiscDev
7

J'ai pu supprimer tous les fichiers en conflit de mon dossier .git, mais j'ai continué à recevoir des erreurs concernant des fichiers qui n'existaient plus.

Le correctif pour moi était d'ouvrir .git/refs/packed_refset de supprimer les lignes contenant le texte "en conflit".

A dessiné
la source
1

Pour moi, c'était une erreur: fatal: Reference has invalid format: 'refs/tags/r0.2:3'

Vous pouvez accéder au fichier /.git/packed_refs et supprimer la ligne pourrefs/tags/r0.2:3

Ensuite, cela a commencé à fonctionner. Mais pourquoi c'est arrivé en premier lieu, je ne sais pas.

Rajesh Paul
la source
0

Essayez une git checkout masterpremière pour atteindre la branche saine et bien nommée.

poussée
la source
Sortie mise à jour dans le message d'origine.
Justin
Hm, pourriez-vous essayer un plein git push origin master, et également coller la sortie de git branch -as'il vous plaît?
poke
Même erreur ici ... essayer git branch -aentraîne cette même erreur!
trusktr
Le problème se trouve sur le référentiel distant, donc l'extraction ou l'extraction ne le résout pas. Les autres réponses ci-dessus se réfèrent à la fixation directe des fichiers sur la télécommande et fonctionnent parfaitement. VOTRE CONSEIL EST TRES BON mais ce n'est pas une réponse au problème.
pid
0

J'obtenais la même erreur

fatal: la référence a un format invalide: 'refs / heads / somebranch (1)'

pour la commande suivante

git branch

Ensuite, j'ai recherché un nom erroné (nom de la branche suivi de (1)) en utilisant la commande

find . -name 'somebranch (1)'

Et il a montré le résultat suivant

./.git/refs/heads/somebranch (1)

Qui est une version dupliquée de somebranch IMO. Donc, j'ai supprimé cela en exécutant la commande find suivie de delete

find . -name 'somebranch (1)' -print -exec rm -rf {} \;

Ensuite, la commande de branche s'exécute avec succès

git branch
Zeeawan
la source
0

J'ai rencontré une erreur similaire telle que

fatal: Reference has invalid format: 'refs/heads/user-search-api (Sithu's conflicted copy 2016-01-08)'

La simple suppression du fichier .git/refs/heads/user-search-api (Sithu's conflicted copy 2016-01-08)dans le référentiel Dropbox distant a résolu le problème.

Sithu
la source