Подтвердить что ты не робот

'git cat-file -p <sha1>': "fatal: Недействительное имя объекта" на случайных объектах из .git/objects

Я хочу узнать больше о внутренней работе git, поэтому я выполнил следующие команды:

cd .git/objects/62

ls
00cb2f01089db22aca24675272a16712e89747
0ee798881329430bfef6c558be7b14c1f0676f
1087f408e2f2bd782d53a1211a7418fee4f6a7
a6a71f3bd5a3af882f3f0ec4fad4c672055746
f95e69f344b52c5038d922260189475626e69a

git cat-file -p 00cb2f01089db22aca24675272a16712e89747

и получил следующую ошибку:

fatal: Not a valid object name 00cb2f01089db22aca24675272a16712e89747

Почему я понял?

Я пробовал 10 раз (для разных файлов из разных каталогов внутри .git/objects) и получил ту же ошибку.

Как я могу просмотреть фактическое содержимое файлов (будь то blob, tree или commit)?

4b9b3361

Ответ 1

Вам не нужно заходить в хранилище объектов.git, но вы должны предоставить полный хэш sha1:

git cat-file -p 621087f408e2f2bd782d53a1211a7418fee4f6a7

Git хранит свои объекты в .git/objects, распределенных по 256 папкам, чтобы уменьшить размер каталога. Первые два символа каждого хеша используются в качестве имени каталога, остальные 38 символов используются в качестве имени файла.

Ответ 2

Спасибо @knittl за отличный ответ.

Вы можете получить все объекты с помощью этого скрипта bash.

cd .git/objects; 
for d in * ; do (
  cd "$d"; 
  for p in * ; do ( echo "$d$p";); done 
); done

Или вы можете получить пробную кошку -p на все!

cd .git/objects; 
for d in * ; do (
  cd "$d"; 
  for p in * ; do ( 
    echo "$d$p";
    git cat-file -p $d$p
  ); done 
); done

Ответ 3

  1. SHA1 - это 40 символов, а 00cb2f01089db22aca24675272a16712e89747 - только 38 символов, что приводит меня к номеру 2.
  2. Я знаю это только потому, что, как и вы, я провел последние 20 минут, стуча головой о стену, выполняя то же самое, что и вы, - отбрасывал префикс из двух символов в начале SHA. Проверьте фото для деталей. прохождение

Также, в качестве предостережения, brew install tree если можете, чтобы лучше рассмотреть SHA.