Git - поиск имени файла из SHA1
Я добавил файл в индекс с помощью
git add somefile.txt
Затем я получил SHA1 для этого файла:
git hash-object somefile.txt
Теперь у меня есть SHA1, и я хотел бы получить имя файла в индексе с помощью SHA1.
git show 5a5bf28dcd7944991944cc5076c7525439830122
Эта команда возвращает содержимое файла, но не имя файла.
Как получить полное имя файла и путь назад из SHA1?
Ответы
Ответ 1
Нет такого прямого отображения в git, так как имя файла является частью объекта дерева, содержащего файл, а не объекта blob, который является содержимым файла.
Это не обычная операция, чтобы получить имя файла из хэша SHA1, поэтому, возможно, вы могли бы расширить его для использования в реальном мире?
Если вы просматриваете текущие файлы (например, HEAD commit), вы можете попробовать следующее.
git ls-tree -r HEAD | grep <SHA1>
Если вы хотите найти содержимое в предыдущих коммитах, вам нужно сделать что-то более похожее.
git rev-list <commit-list> | \
xargs -n1 -iX sh -c "git ls-tree -r X | grep <SHA1> && echo X"
Ответ 2
Отличный лайнер для этого:
git rev-list --objects --all | grep <blob sha1>
Ответ 3
Следующая оболочка script в значительной степени основана на Какой фиксатор имеет этот blob? и ответ, предоставленный Аристотелем Пагальцисом.
#!/bin/sh
obj_hash=$1
# 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
Я уверен, что кто-то может украсить этот script, но он действительно работает.
Идея состоит в том, чтобы посмотреть на все обработанные деревья и найти конкретный хэш.
Ответ 4
git rev-list <commit-list>
не будет содержать никаких коммитов, которые, например, были удалены с помощью rebase -i
и теперь ссылаются только на reflog, поэтому, если blob не найден по команде выше, вы должны также проверить reflog, например:
git reflog --all | \
cut -d\ -f1 | \
xargs -n1 -iX sh -c "git ls-tree -r X | grep <BLOB_SHA> && echo X"
Ответ 5
Зафиксируйте файл и обратите внимание на хэш файл sha1 объекта commit. После этого используйте
git ls-tree <commit-sha1>
и вы получите имена файлов с хэшами.
Проверьте страницы руководства на наличие дополнительных параметров.