正如其他人所说,没有内置的东西可以做到这一点。然而,我们可能会注意到,Git 在存储库本身中存储了四种对象:blob(文件)、树(表示满目录的文件)、提交(通过 parent 形成有向无环图em> 标识符,每个提交携带一个 tree 对象、一个作者、一个提交者、它的父集和任意日志消息)和注释标签对象(没有强定义关系,但每个标签只有一个目标对象,通常是一个提交)。
旁白:git notes 的工作原理
Git 的 notes 在内部表示为提交。每个提交都有一组“文件”作为它的树,它们的名称只是碰巧——完全是偶然的:-) ...咳咳——与某些提交集完全相同1在存储库中。当git log 显示一个ID 为C 的提交时,它“偶然”检查refs/notes/commits 是否存在,如果存在,是否存在名为C 的文件存在于refs/notes/commits 指向的提交中,如果存在,则将该文件的内容附加到日志消息中。所以这就是注释附加到提交的方式:Git 的一个内置部分检查是否有特殊引用 (refs/notes/commits) 指向包含包含“文件”的树的提交(最终它确实是一个文件,因为它是一个普通的 Git blob 对象),应该添加到提交日志消息中。
当您修改注释集时,Git 只需使用新树进行新提交。新的提交指向之前的 refs/notes/commits 提交作为其父提交,因此旧的注释仍然存在并且可以(有一些困难)被视为过去(这曾经非常困难;我相信它变得更容易了)。 Git 的自然压缩包文件可以很好地处理这些问题,因此笔记占用的空间只会随着新笔记的添加而线性增长。
1为了提高效率,对“名称”进行了一些修改,例如,可以将注释文件命名为deadbeefcafebabec0ffeedecadefadedbedcede,而不是命名为de/ad/beefcafe...。
因此,解决方案是显而易见的(咳咳)
您希望表示排列在一个目录或一系列目录中的一组文件。那当然是一棵树,而Git 有树对象。因此,您应该创建一个树对象来保存其中一种状态。
你没有说你是否希望保留这棵树的多个历史版本。如果这样做,解决方案很明显:就像git notes 一样处理它们,使用新的提交对象来存储每个新树,链接提交以使过去的版本可检索。如果没有,是否创建提交对象完全取决于您,因为单个标签对象可以直接指向树对象。 (一些非 Git 工具可能在提交或其他标签之外的任何标签上存在问题。不过,Git 本身的 Git 存储库中有一些这样的标签。)
无论如何,您还需要一个顶级引用来指向指向最新树的提交或注释标记对象。
创建树很容易:只需填充一个索引文件(不是常规文件,而是备用文件,您将其名称写入环境变量GIT_INDEX_FILE),使用您希望它们出现在树中的文件名,通过git add-ing 文件(如果它们不存在,这也会将必要的 blob 放入存储库中),然后调用 git write-tree。这会将索引转换为所需的树对象(之后您可能并且可能应该丢弃导出的 GIT_INDEX_FILE 设置),像往常一样将新对象的 ID 打印到标准输出。编写提交和/或标记对象以指向该树只需调用git commit-tree 和/或git mktag(它们会将自己的新对象写入存储库,像以前一样将ID 打印到标准输出) .最后,使用git update-ref 创建或更新指向标记或提交对象的引用——您现在已经重新实现了git notes,但形式更适合您自己的需求。
您可以随时将任何保存的树提取到您选择的任何工作树中,只需一个简单的git checkout 使用另一个临时索引。