如何解压打包参考?

Max*_*ske 17 git command-line

我使用git clone --mirror从github克隆了一个项目.这给我留下了一个带有packed-refs文件,.pack.idx文件的存储库.出于开发目的,我想查看松散的对象,所以我用git unpack-objects <<pack file>解压缩对象,这很好(如果你想知道,我将包文件解压缩到一个新的repo中).唯一的问题是refs/heads /仍然是空的,所有的refs仍然只在packed-refs中,但我需要它们在refs/heads /中.我无法找到一个提取或解压缩这些引用的命令,我不知道我不会相信我必须手动(或通过管道)这样做.

所以实际上我有两个问题:

  1. 有没有一种简单的方法可以从打包引用中 "恢复" 引用
  2. 如果没有,为什么不存在?如果有一个解包对象的命令,那么为refs提供相同内容的原因是什么(不要忘记甚至还有一个命令git pack-refs ...)

感谢您的任何提示和想法.

cle*_*lee 30

简短的回答是"不" - 没有"简单的方法"以您要求的方式解压缩裁判.

稍微长一点的答案是,每个ref只是一个特定路径中的41字节文本文件(十六进制中40字节SHA1 +换行符),因此"硬"版本只需要这样的内容~/.gitconfig:

[alias]
unpack-refs = "!bash -c 'IFS=$''\\n''; for f in $(git show-ref --heads); do /bin/echo ''Writing  '' $(echo $f | cut -c42-); echo $(echo $f | cut -c1-40) > \"${GIT_DIR:-.git}/$(echo $f | cut -c42-)\"; done'"
Run Code Online (Sandbox Code Playgroud)

想要弄清楚如何让它正常工作有点棘手,但你去了!现在你有了'git unpack-refs'并且它可以达到预期的效果,如果设置了它,它甚至可以与$ GIT_DIR一起使用(否则它假设你在git树的根目录中).如果您还没有阅读git别名,https://git.wiki.kernel.org/index.php/Aliases是一个很好的参考,甚至包括一个示例'git alias'扩展,您可以使用它来扩展自己的别名.

  • **关闭主题** - 40字节SHA1错误.SHA1由40个十六进制字符组成,相当于160位=> 20字节. (3认同)
  • 别名对我不起作用,但答案仍然包含有用信息...... (2认同)

Cas*_*bel 13

打包引用存在的原因是为了加速使用数以万计的refs在repo中访问 - 使用多行来查看单个文件比为每个ref更轻松地查看文件系统一次.git中需要了解refs的任何东西都可以通过代码来读取refs目录和压缩的refs文件.打开它会破坏它的目的.如果要访问refs,请使用管道命令(例如show-ref,for-each-ref,update-ref ...).我无法想到任何类型的访问,使用目录结构比使用管道命令更快更容易(特别是for-each-ref可用).

是的,打包的对象(如打包引用)是为了提高性能而创建的,但是存在巨大的差异.打包的refs文件只是一堆独立的行.您可以,基本上免费,添加或删除它.没有必要解压缩它来修改它.另一方面,打包的对象是delta压缩的,因此内部的对象彼此依赖.它们大大减少了磁盘使用量,并且可以以合理的成本从它们中读取对象,但是尝试修改包中的对象集比修改松散对象要昂贵得多,所以它只是定期执行git repack(调用git gc),尽管我不相信git repack实际上解压缩对象 - 它只是从包文件中读取它们,用松散包装它们,并制作一个新的包.

但是,当从远程传输包时,它会在本地解压缩.我在git receive-pack源代码中看到了对unpack方法的调用,该手册pack-objects页说:

git unpack-objects命令可以读取打包存档并将包中包含的对象扩展为"单文件单对象"格式; 这通常是通过智能拉取命令完成的,当动态创建包时,由同行进行有效的网络传输.