我正在尝试使用包含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
答案 0 :(得分:5)
当git clone
或git 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/*
行,则 应该复制备注。