Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
';git cat文件-p<;sha1>';:&引用;致命:不是有效的对象名称;关于.git/objects中的随机对象_Git - Fatal编程技术网

';git cat文件-p<;sha1>';:&引用;致命:不是有效的对象名称;关于.git/objects中的随机对象

';git cat文件-p<;sha1>';:&引用;致命:不是有效的对象名称;关于.git/objects中的随机对象,git,Git,我想进一步了解git的内部工作原理,因此我运行了以下命令: cd .git/objects/62 ls 00cb2f01089db22aca24675272a16712e89747 0ee798881329430bfef6c558be7b14c1f0676f 1087f408e2f2bd782d53a1211a7418fee4f6a7 a6a71f3bd5a3af882f3f0ec4fad4c672055746 f95e69f344b52c5038d922260189475626e69a g

我想进一步了解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)?

您不必将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
  • SHA1是40个字符,
    00cb2f01089db22aca24675272a16712e89747
    只是38个字符,这让我找到了数字2
  • 我之所以知道这一点,是因为和你一样,我花了20分钟的时间把头撞在墙上,做了和你一样的事情,那就是在SHA开头去掉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