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?
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"
Great one-liner pour ce faire:
git rev-list --objects --all | grep <blob sha1>
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.
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"
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.