Git-trouver un nom de fichier à partir D'un SHA1

j'ai ajouté un fichier à l'index:

git add somefile.txt

j'ai alors obtenu le SHA1 pour ce dossier avec:

git hash-object somefile.txt

j'ai maintenant un SHA1 et je voudrais récupérer le nom de fichier de l'objet dans l'index en utilisant le SHA1.

git show 5a5bf28dcd7944991944cc5076c7525439830122

Cette commande renvoie le contenu du fichier, mais pas le nom du fichier.

Comment puis-je obtenir le nom de fichier complet et le chemin de retour à partir du SHA1?

31
demandé sur git-noob 2009-01-20 10:12:20

5 réponses

il n'y a pas de mappage direct dans git car le nom du fichier fait partie de l'arbre qui contient le fichier, et non de l'objet blob qui est le contenu du fichier.

ce n'est pas une opération habituelle de vouloir récupérer un nom de fichier à partir D'un hash SHA1 donc peut-être vous pourriez développer sur un cas d'utilisation du monde réel pour elle?

si vous regardez les fichiers courants (i.e. la tête de propagation), vous pouvez essayer ce qui suit.

git ls-tree -r HEAD | grep <SHA1>

Si vous voulez trouver le contenu des propagations précédentes, vous devez faire quelque chose de plus similaire.

git rev-list <commit-list> | \
xargs -n1 -iX sh -c "git ls-tree -r X | grep <SHA1> && echo X"
24
répondu CB Bailey 2014-05-23 21:34:42

Great one-liner pour ce faire:

git rev-list --objects --all | grep <blob sha1>
21
répondu brandonscript 2014-05-23 21:30:31

le script shell suivant est fortement basé sur qui commit a ce blob? et la réponse fournie par Aristote Pagaltzis.

#!/bin/sh

obj_hash=

# go over all trees
git log --pretty=format:'%T %h %s' \
| while read tree commit subject ; do
     git ls-tree -r $tree | grep  "$obj_hash" \
     | while read a b hash filename ; do
        if [ "$hash" == "$obj_hash" ]; then
          f=$filename
          echo $f
          break
        fi
        if $f ; then break; fi
      done
      if $f; then break; fi
done

je suis sûr que quelqu'un pourrait embellir ce script mais il fonctionne. L'idée est de regarder tous les arbres engagés et de chercher votre hachage spécifique.

7
répondu nimrodm 2017-05-23 12:18:24

git rev-list <commit-list> n'inclut pas les commits qui ont été par exemple supprimés par rebase -i et sont maintenant référencés uniquement par reflog, donc si blob n'est pas trouvé par commande ci-dessus, vous devez vérifier reflog ie comme ceci:

git reflog --all | \
cut -d\  -f1 | \
xargs -n1 -iX sh -c "git ls-tree -r X | grep <BLOB_SHA> && echo X"
2
répondu JaMa 2014-05-23 21:36:33

valider le fichier et note le hash sha1 de la livraison de l'objet. Après cette utilisation

git ls-tree <commit-sha1>

et vous obtiendrez les noms des fichiers avec les hachures.

vérifiez les pages de manuel pour plus d'options.

0
répondu Baishampayan Ghose 2009-01-20 07:54:23