'git cat-file -p <sha1>':“致命:不是有效的对象名称”来自.git / objects的随机对象</sha1>

时间:2011-11-16 10:11:17

标签: 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,树还是提交)?

4 个答案:

答案 0 :(得分:24)

您不必进入.git对象存储区,但必须提供完整的sha1哈希:

git cat-file -p 621087f408e2f2bd782d53a1211a7418fee4f6a7

Git将其对象存储在.git/objects中,分布在256个文件夹中,以保持目录的大小。每个哈希的前两个字符用作目录名称,其余38个字符用作文件名。

答案 1 :(得分:1)

感谢@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

答案 2 :(得分:1)

我想澄清一下@Knittl 提供的答案

Git 将“散列对象”存储到“对象”文件夹中,但它们的存储方式很聪明:

folder_name + file_name = hash_code

命令cat-file 使用该哈希码而不是存储在对象文件夹中的file_name,因此不必也进入该文件夹

答案 3 :(得分:0)

  1. SHA1是40个字符,00cb2f01089db22aca24675272a16712e89747仅是 38 个字符,这使我进入了数字2。
  2. 我只知道这一点,因为就像您一样,我花了最后20分钟在墙上敲了敲我的头,做了同样的事情,即在SHA的开头删除了2个字符的前缀。查看照片以获取详细信息。 walkthrough

另外,请注意,brew install tree如果可以更好地了解SHA。