代码之家  ›  专栏  ›  技术社区  ›  Corey Floyd

如何在不使用git的情况下查看git对象和索引

  •  15
  • Corey Floyd  · 技术社区  · 16 年前

    使用OS X终端,

    您如何以纯文本形式查看这些文件的内容?

    5 回复  |  直到 10 年前
        1
  •  9
  •   Greg Bacon    10 年前

    “Object storage format” in Git User Manual .

    它是原始压缩数据,使用 zlib . 一个人可以用 zpipe 来自“zlib1g dev”包。编译 the example 具有 gcc -o zpipe zpipe.c -lz . 这不是标准 .gz 或者什么的。

    ./zpipe -d < .git/objects/02/43019ddb4d94114e5a8580eec01baeea195133
    

    打印blob的内容(头+数据)

    如果要检查sha-1,必须将未压缩的blob放入文件中。( myblob 和做

    sha1sum myblob
    
        2
  •  13
  •   bwtaylor    15 年前
    alias deflate="perl -MCompress::Zlib -e 'undef $/; print uncompress(<>)'"
    
    deflate .git/objects/4b/3083256dedabd68e839d7717aa785424119990 | sha1sum
    4b3083256dedabd68e839d7717aa785424119990  -
    
        3
  •  10
  •   Jakub Narębski adamtaub    16 年前

    如果要查看git对象的纯文本格式(提交和/或blob,即文件内容) 没有 使用Git并不容易,特别是如果存储库是打包的。你不能在本地安装git吗,在你的主目录中(或者在MacOS X上安装它的等效目录)?

    格式 释放 对象,作为文件存储在 .git/objects/ 扇出目录,例如 .git/objects/02/43019ddb4d94114e5a8580eec01baeea195133 (扇出目录和文件名形式为sha-1对象标识符),如中所述。 Chapter 9.2 "Git Objects" “pro-git”书籍(免费在线提供)和 Chapter 7.1 "How Git Stores Objects" “Git社区手册”中。

    这个 包装 格式,其中一组对象存储在单个文件中 .git/objects/pack/ ,例如 .git/objects/pack/pack-1db7aa96d95149a4dd341490a3594181a24415ee.pack ,描述见 Documentation/technical/pack-format.txt Chapter 7.5 "The Packfile" “Git社区手册”(并在 Chapter 9.4 "Packfiles" “pro-git”的编号)


    如果您想找到最新的提交,请先看看 .git/HEAD 文件以查找当前分支。它将包含如下内容:

    ref: refs/heads/master
    

    (如果它包含sha-1,您可以将其作为最后一次提交的ID,并跳过一个步骤)。然后检查例如 .git/refs/heads/master 找到分支指向的位置。它将包含提交的SHA-1,例如:

    dbc1b1f71052c084a84b5c395e1cb4b5ae526fcb
    

    最后一次(最近一次)提交可能是松散格式的;在本例中,它可能是 .git/objects/db/c1b1f71052c084a84b5c395e1cb4b5ae526fcb 文件。

        4
  •  8
  •   Alex Brown    16 年前

    我要用另一种方式解释你的问题。如果要了解对象文件是什么,可以使用git直接查看它们,而不必导航历史日志或使用git签出、diff等。例如:

    对于文件 .git/objects/04/a42e9a7282340ef0256eaa6d59254227b8b141

    运行命令

    git show 04a42e
    

    它结合了 04 /04/ 其余号码的前四个字符 a42e .

    > git show 04a42e
    commit 04f7db976fa54c72fcc6350dd7d0aa06cb249df6
    Author: Alex Brown <alex@XXXX.XXX>
    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、树等。

        5
  •  0
  •   Community Mohan Dere    9 年前

    索引存储在 .git/index .

    它是在以下位置指定的二进制未压缩格式: 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 按字段验证格式字段。

    下面的问题更侧重于索引: What does the git index contain EXACTLY?