使用 OS X 终端,
如何以纯文本形式查看这些文件的内容?
alias deflate="perl -MCompress::Zlib -e 'undef $/; print uncompress(<>)'"
deflate .git/objects/4b/3083256dedabd68e839d7717aa785424119990 | sha1sum
4b3083256dedabd68e839d7717aa785424119990 -
我将以不同的方式解释你的问题。如果你想了解对象文件是什么,你可以使用 git 直接查看它们,而无需导航历史日志或使用 git checkout、diff 等。例如:
对于文件
.git/objects/04/a42e9a7282340ef0256eaa6d59254227b8b141
运行命令
git show 04a42e
结合了
04
中的 /04/
和剩余数字 a42e
的前四个字符。
> git show 04a42e
commit 04f7db976fa54c72fcc6350dd7d0aa06cb249df6
Author: Alex Brown <[email protected]>
Date: Fri Jan 8 11:02:21 2010 +0000
a text file
diff --git a/1.txt b/1.txt
new file mode 100644
index 0000000..04a42e9
--- /dev/null
+++ b/1.txt
@@ -0,0 +1,3 @@
+Woo
+# boo
+# choo
这是一个提交,其他对象可能是文件 blob、树等
它是使用 zlib 的原始压缩数据。可以使用“zlib1g-dev”包中的
zpipe
。使用 gcc -o zpipe zpipe.c -lz
编译示例。这不是标准
.gz
之类的。
./zpipe -d < .git/objects/02/43019ddb4d94114e5a8580eec01baeea195133
打印 blob 的内容(标头+数据)
如果你想检查 SHA-1,你必须将未压缩的 blob 放入文件中 (
myblob
) 并执行
sha1sum myblob
如果您想在不使用 git 的情况下查看纯文本形式的 git 对象(提交和/或 blob,即文件内容),这并不容易,尤其是在存储库已打包的情况下。你不能在你的主目录(或 MacOS X 上的等效目录)中本地安装 git 吗?
loose对象的格式,作为文件存储在.git/objects/
扇出目录中,例如
.git/objects/02/43019ddb4d94114e5a8580eec01baeea195133
(扇出目录和文件名形成对象的 SHA-1 标识符),例如描述为参见“Pro Git”第二版书籍(免费在线提供)的第 10.2 章“Git 对象”和“Git 社区书籍”的第 7.1 章“Git 如何存储对象”。 pack 格式,其中一组对象存储在
.git/objects/pack/
中的单个文件中,例如.git/objects/pack/pack-1db7aa96d95149a4dd341490a3594181a24415ee.pack
,在pack-format
文档 (
git help pack-format
) 和“Git Community Book”的第 7.5 章“Packfile”中进行了描述(并在“Pro Git”的第 10.4 章“Packfiles” 中提到) ,第二版) 如果你想找到最新的提交,请先查看
.git/HEAD
ref: refs/heads/master
(如果包含SHA-1,可以将其作为最后一次提交的id,跳过这一步)。然后检查例如.git/refs/heads/master
找到分支指向的位置。它将包含提交的 SHA-1,例如:
dbc1b1f71052c084a84b5c395e1cb4b5ae526fcb
最后(最近)提交可能采用松散格式;在此示例中,它将位于 .git/objects/db/c1b1f71052c084a84b5c395e1cb4b5ae526fcb
文件中。索引存储在
它是指定的二进制未压缩格式:https://github.com/git/git/blob/master/Documentation/technical/index-format.txt,因此阅读它的唯一方法是使用类似的工具
hd
。
index
文件包含文件列表及其元数据,包括 inode、权限和修改时间。它还包含内容的 SHA-1,该内容存储为对象,这意味着当您执行 git add
时,它可能会创建新对象。
我鼓励您创建一个简单的测试存储库,例如
git init init && cd init && echo a > a && git add a
,然后 hd .git/index
逐个字段验证格式。
下面的问题更关注索引:git 索引到底包含什么?