我想了解更多关于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,树还是提交)?
答案 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)
00cb2f01089db22aca24675272a16712e89747
仅是 38 个字符,这使我进入了数字2。另外,请注意,brew install tree
如果可以更好地了解SHA。