'git cat-file-p ':" fatal: недопустимое имя объекта " для случайных объектов.git / объекты

Я хочу узнать больше о внутренней работе 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, дерево или фиксация)?

2 ответов


вам не нужно cd в .git object store, но вы должны предоставить полный хэш sha1:

git cat-file -p 621087f408e2f2bd782d53a1211a7418fee4f6a7

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


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

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

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

или вы можете получить запустить cat-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