';git cat文件-p<;sha1>';:&引用;致命:不是有效的对象名称;关于.git/objects中的随机对象
我想进一步了解git的内部工作原理,因此我运行了以下命令:';git cat文件-p<;sha1>';:&引用;致命:不是有效的对象名称;关于.git/objects中的随机对象,git,Git,我想进一步了解git的内部工作原理,因此我运行了以下命令: cd .git/objects/62 ls 00cb2f01089db22aca24675272a16712e89747 0ee798881329430bfef6c558be7b14c1f0676f 1087f408e2f2bd782d53a1211a7418fee4f6a7 a6a71f3bd5a3af882f3f0ec4fad4c672055746 f95e69f344b52c5038d922260189475626e69a g
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)?您不必将cd刻录到.git对象存储中,但必须提供足够的完整sha1哈希,以便git唯一地标识对象 通常前6或7位数字就足够了。Git从前面开始匹配对象ID,因此输入任何子字符串(如最后几位数字)都将失败(或匹配到与预期不同的对象)
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
或者你可以得到一个运行猫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
00cb2f01089db22aca24675272a16712e89747
只是38个字符,这让我找到了数字2另外,作为一个警告,
brew安装树
,如果可以的话,可以更好地查看SHA。好的,但不是cd'ing到。git对象没有回答我的问题。。。为什么我会出错?那么我如何看待对象的实际内容呢?@igorpov:它回答了你的问题。您试图显示一个不存在的对象。仔细看看你的散列和我的答案中的散列-看到区别了吗?我在问题中添加了“ls”的实际输出。如您所见,没有名称以“62”开头的文件。git cat文件对这些文件中的每一个都失败。如果它在“ls”输出中,那么我猜它是存在的…@igorpov:你真的试过我提供的命令吗?你读过我回答的最后一句话了吗?文件名与对象哈希不直接对应,因为它们分散到256个子目录。Git对象的实际哈希是目录名+文件名(620cb2f01089db2aca246752a16712e89747
,620ee798881329430bfef6c558be7b14c1f06766f
,621087f408e2f2db782d53a121a7418fee4f6a7
,62a6a71f5a3af882f0ec4fad4c672055746
)和62f95e6e64959e645b508f3692269a9ok),现在我已经试过这个命令了,奇怪的是:它成功了。。。现在我明白了。。。感谢您的时间和回答:)-->投票并接受!似乎没有人给出一个直截了当的答案。只需在您使用的哈希前面添加62。
cd .git/objects;
for d in * ; do (
cd "$d";
for p in * ; do (
echo "$d$p";
git cat-file -p $d$p
); done
); done