Comment réparer un repo local Git ?

Développement web 24 mars 2020

J'ai récemment été confronté à un problème sur un repo local Git.

Dans un composer.json, il y avait une dépendance vers un repo Git privé sous Gitlab. Lorsque je passais la commande composer install, j'obtenais une exception.

[RuntimeException]Failed to execute git checkout '6a9191a6eefe3dabd4cc2fff49d28b3477082286' -- && git reset --hard '6a9191a6eefe3dabd4cc2fff49d28b3477082286' --fatal: failed to read object 6a9191a6eefe3dabd4cc2fff49d28b3477082286: Operation not permitted

Le git fsck m'indiquait que le repo était corrompu :

bash-5.0# git fsck --full
Checking object directories: 100% (256/256), done.
error: packfile .git/objects/pack/pack-84abd7b597860a47c47a0fb17cdd22866d64dd2d.pack index not opened
fatal: failed to read object c3497b2a0f8eb0a6f805be44b96041c292f2e16c: Operation not permitted

Après plusieurs tentatives de résolution sans succès, j'ai fini par trouver une solution simple. S'agissant d'un repo Git local, je connais l'url du repo distant. Ces commandes devraient vous aider.

mv -v .git .git_old &&            # On retire le dossier .git
git init &&                       # On initialise un nouveau repo local
git remote add origin "<url>" &&  # On le connecte sur le repo distant
git fetch &&                      # On recup les sources
git reset origin/master --mixed   # On force la mise a jour avec nos sources locales 

That's it !

Super ! Vous vous êtes inscrit avec succès.
Super ! Effectuez le paiement pour obtenir l'accès complet.
Bon retour parmi nous ! Vous vous êtes connecté avec succès.
Parfait ! Votre compte est entièrement activé, vous avez désormais accès à tout le contenu.