'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)?
Ответы
Ответ 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
- SHA1 - это 40 символов, а
00cb2f01089db22aca24675272a16712e89747
- только 38 символов, что приводит меня к номеру 2. - Я знаю это только потому, что, как и вы, я провел последние 20 минут, стуча головой о стену, выполняя то же самое, что и вы, - отбрасывал префикс из двух символов в начале SHA. Проверьте фото для деталей. прохождение
Также, в качестве предостережения, brew install tree
если можете, чтобы лучше рассмотреть SHA.