在git clone --mirror`之后,Git注意到了

时间:2017-08-28 11:46:39

标签: git git-clone

我正在尝试使用包含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

获取引用之间的差异显示镜像存储库中缺少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中指定fetch = +refs/*:refs/*

mirror/config也无法提取备注。

现在的问题是:我有什么遗失的吗?我正在使用git 2.3.0

1 个答案:

答案 0 :(得分:5)

git clonegit fetch获得引用时,它们通常会将其“打包”。

根据用户的全名,.git/refs/每个文件都会存储一个解压缩的引用,例如,您可以获得.git/refs/heads/master.git/refs/notes/commits

打包引用(当前)存储在一个文件.git/packed-refs中。这包含每行一个引用,以及一些引用的额外“去皮”变体(带注释的标签,真的)。

如果两个地方都出现了引用,Git“更喜欢”解压缩的引用(这样在更新引用时就不必从打包文件中删除条目)。更新引用通常会解压缩它:更新和/或更容易继续更新单个条目文件(如.git/refs/heads/master),而不是继续替换多条目文件中的一行。

Git可以随时解压缩或重新打包引用,因此只保证diff两棵.git树不能保证对您有任何好处。 (同样适用于打包和解压缩的对象,但我看到你只是在差异refs子目录。)所以你引用的diff输出没有说明是否注释克隆了。要查看是否克隆了笔记,请进入克隆并使用读取笔记的操作。

在任何情况下,如果有fetch = +refs/*:refs/*行,则 应该复制备注。