Git - поиск имени файла из SHA1 - PullRequest
33 голосов
/ 20 января 2009

Я добавил файл в индекс с:

git add somefile.txt

Затем я получил SHA1 для этого файла с:

git hash-object somefile.txt

Теперь у меня есть SHA1, и я хотел бы получить имя файла объекта в индексе, используя SHA1.

git show 5a5bf28dcd7944991944cc5076c7525439830122

Эта команда возвращает содержимое файла, но не имя файла.

Как получить полное имя файла и путь назад от SHA1?

Ответы [ 5 ]

26 голосов
/ 20 января 2009

В git такого прямого сопоставления нет, поскольку имя файла является частью объекта дерева, содержащего файл, а не объекта blob, который является содержимым файла.

Это не обычная операция, когда нужно извлечь имя файла из хэша SHA1, так что, возможно, вы могли бы расширить его для реального случая использования?

Если вы просматриваете текущие файлы (например, коммит HEAD), вы можете попробовать следующее.

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"
25 голосов
/ 24 мая 2014

Отличный однострочник для этого:

git rev-list --objects --all | grep <blob sha1>
7 голосов
/ 20 января 2009

Следующий сценарий оболочки в значительной степени основан на Какой коммит имеет этот 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

Я уверен, что кто-то может украсить этот скрипт, но он работает. Идея состоит в том, чтобы просмотреть все зафиксированные деревья и найти ваш конкретный хеш.

3 голосов
/ 19 ноября 2011

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"
0 голосов
/ 20 января 2009

Зафиксируйте файл и запишите хэш sha1 объекта коммита. После этого используйте

git ls-tree <commit-sha1>

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

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

...