git - 为什么父级存储在 git Notes 中?

标签 git git-svn internals git-notes

git存储笔记的方式:

  • Git 只为单个命名空间的每次提交存储一个注释。一个可以有多个命名空间。默认命名空间是commit。
  • .git/refs/notes/包含一个哈希(例如 MainHash_2),它是一个树对象。每当您创建注释时,哈希值就会发生变化。
  • 该树对象还包含两个哈希值。一对到另一个树结构(注释树结构,例如 NOTES_2)和一个到父树对象(创建此注释之前 .git/refs/notes/中的一个,例如 MainHash_1 )
  • 笔记树结构包含每个笔记的一个条目。每个条目都有两个哈希:一个用于记录内容,另一个用于指定提交。

正如第三点提到的,为什么要存储父级?由于此父级(其类型与第二点中提到的相同)还包含另一棵树,其中每个注释包含一个条目。

假设当前您有三个笔记。 MainHash_2 包含 NOTES_2 的哈希值,其中每个注释包含三个条目。 MainHash_1 包含 NOTES_1 的哈希值,其中包含两个条目(针对除现在创建的注释之外的所有剩余注释)。 为什么要存储这两个条目两次等等?

最佳答案

只是因为notes命名空间在git中并不是什么特别的东西,它们只是具有完整历史的普通分支。你可以做

git checkout notes/commits

并像处理任何其他分支一样处理您的笔记,例如你可以做

git log notes/commits

查看您的笔记的提交日志。这样您就可以跟踪笔记的所有更改。

你说过:

.git/refs/notes/commits contains one hash (say, MainHash_2), which is a tree object.

这不是一个对象,它是一个提交。就像 .git/refs/heads/master 中一样。您可以通过git cat-file -t <hash>查看

关于git - 为什么父级存储在 git Notes 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17018267/

相关文章:

php - array_merge 与 union 在 PHP 中的性能

java - 如何使用Java中的新API替换sun.util.calendar.ZoneInfo

git - ssh:连接到主机 bitbucket.org 端口 22:连接超时

git - 获取与特定分支上文件的最后更改相关的标签名称

git-svn 试图提交到错误的分支

windows - Win32 堆栈部分基地址

git - 自定义默认 TFS Git 构建模板

git - 将单个文件从克隆的仓库推送到 fork 的仓库

git - 将 SVN 更改移动到 git

linux - git-svn 是否有可接受的 Linux 目标 GUI 客户端?