Vous devriez pouvoir récupérer tous les fichiers que vous avez ajoutés à l'index (par exemple, comme dans votre situation, avec git add .
) bien que cela puisse être un peu de travail. Afin d'ajouter un fichier à l'index, git l'ajoute à la base de données d'objets, ce qui signifie qu'il peut être récupéré tant que le garbage collection n'a pas encore eu lieu. Il y a un exemple de la façon de faire cela donné dans la réponse de Jakub Narębski ici:
Cependant, j'ai essayé cela sur un référentiel de test, et il y a eu quelques problèmes - --cached
devrait être --cache
, et j'ai trouvé que cela ne créait pas réellement le .git/lost-found
répertoire. Cependant, les étapes suivantes ont fonctionné pour moi:
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)")
Cela devrait afficher tous les objets de la base de données d'objets qui ne sont accessibles par aucune référence, dans l'index ou via le reflog. La sortie ressemblera à ceci:
unreachable blob 907b308167f0880fb2a5c0e1614bb0c7620f9dc3
unreachable blob 72663d3adcf67548b9e0f0b2eeef62bce3d53e03
... et pour chacun de ces blobs, vous pouvez faire:
git show 907b308
Pour sortir le contenu du fichier.
Trop de sortie?
Mise à jour en réponse au commentaire de sehe ci-dessous:
Si vous constatez que de nombreuses validations et arborescences sont répertoriées dans la sortie de cette commande, vous souhaiterez peut-être supprimer de la sortie tous les objets référencés à partir de validations non référencées. (En règle générale, vous pouvez revenir à ces commits via le reflog de toute façon - nous sommes simplement intéressés par les objets qui ont été ajoutés à l'index mais qui ne peuvent jamais être trouvés via un commit.)
Tout d'abord, enregistrez la sortie de la commande, avec:
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") > all
Maintenant, les noms d'objet de ces commits inaccessibles peuvent être trouvés avec:
egrep commit all | cut -d ' ' -f 3
Ainsi, vous pouvez trouver uniquement les arbres et objets qui ont été ajoutés à l'index, mais non validés à aucun moment, avec:
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") \
$(egrep commit all | cut -d ' ' -f 3)
Cela réduit énormément le nombre d'objets que vous devrez considérer.
Mise à jour: Philip Oakley ci-dessous suggère une autre façon de réduire le nombre d'objets à prendre en compte, qui consiste à ne considérer que les fichiers les plus récemment modifiés sous .git/objects
. Vous pouvez les trouver avec:
find .git/objects/ -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort
(J'ai trouvé cette find
invocation ici .) La fin de cette liste pourrait ressembler à:
2011-08-22 11:43:43.0234896770 .git/objects/b2/1700b09c0bc0fc848f67dd751a9e4ea5b4133b
2011-09-13 07:36:37.5868133260 .git/objects/de/629830603289ef159268f443da79968360913a
Dans ce cas, vous pouvez voir ces objets avec:
git show b21700b09c0bc0fc848f67dd751a9e4ea5b4133b
git show de629830603289ef159268f443da79968360913a
(Notez que vous devez supprimer le /
à la fin du chemin pour obtenir le nom de l'objet.)