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>

и вы получите имена файлов с хэшами.

Проверьте страницы руководства на наличие дополнительных параметров.