Git 注释在 `git clone --mirror` 后丢失

Git notes missing after `git clone --mirror`

我正在尝试使用所有可用 refs 包括 refs/notes/* 镜像本地存储库。但是,笔记并未按预期克隆。

要重现该问题,请在空目录中执行这些命令:

$ git init repo && cd repo
$ git commit --allow-empty -m 'initial commit'
$ git notes add -m 'Initial commit on empty repo' HEAD
$ git clone --mirror .git ../mirror

获取 refs 之间的差异显示镜像存储库中缺少 notes

$ diff repo/.git/refs mirror/refs
Common subdirectories: repo/.git/refs/heads and mirror/refs/heads
Common subdirectories: repo/.git/refs/tags and mirror/refs/tags
Only in repo/.git/refs: notes

git -C mirror fetch 也不会获取注释,即使在 mirror/config.

中指定了 fetch = +refs/*:refs/*

现在的问题是:我是否遗漏了什么?我正在使用 git 2.3.0

git clonegit fetch获得引用时,他们通常会留下"packed"。

解压缩后的引用根据其全名在 .git/refs/ 中每个文件存储一个,例如,您可以得到 .git/refs/heads/master.git/refs/notes/commits

打包的引用(当前)全部存储在一个文件中,.git/packed-refs。这包含每行一个参考,加上一些参考的额外 "peeled" 变体(实际上是带注释的标签)。

如果引用出现在两​​个地方,Git "prefers" 解压缩的引用(这样它就不必在更新引用时从打包文件中删除条目)。更新引用通常会解压它:and/or 像 .git/refs/heads/master 这样的单条目文件比在多条目文件中不断替换一行更容易 and/or。

Git 可以随时解包或重新打包引用,所以简单地 diffing 两棵 .git 树并不能保证对你有任何好处。 (同样适用于打包和解包的 objects,但我看到你只是在区分 refs 子目录。)所以你引用的 diff 输出没有说明笔记是否被克隆。要查看笔记是否被克隆,请进入克隆并使用读取笔记的操作。

无论如何,如果有 fetch = +refs/*:refs/* 行,您 应该 复制笔记。