什么';捆绑和压缩git回购的区别是什么?

什么';捆绑和压缩git回购的区别是什么?,git,Git,当我表演 git bundle create ../`basename $PWD`.all.gitbundle --all 在git存储库中,创建的捆绑文件大小约为4.8MB。当我压缩整个存储库文件夹时,生成的文件大小为26,2MB 基本上,我在寻找一种在不丢失任何信息的情况下备份整个存储库的方法。但是考虑到存档文件大小的差异,我假设git bundle不能备份所有内容,或者比简单的zip更有效 有人能解释一下吗 bundle命令将打包通常需要的所有内容 用git推一下电线 这意味着捆绑包中

当我表演

git bundle create ../`basename $PWD`.all.gitbundle --all
在git存储库中,创建的捆绑文件大小约为4.8MB。当我压缩整个存储库文件夹时,生成的文件大小为26,2MB

基本上,我在寻找一种在不丢失任何信息的情况下备份整个存储库的方法。但是考虑到存档文件大小的差异,我假设
git bundle
不能备份所有内容,或者比简单的zip更有效

有人能解释一下吗

bundle命令将打包通常需要的所有内容 用git推一下电线

这意味着捆绑包中不会有过时的对象等,它们将成为存储库的一部分。此外,您不应该计算repo工作目录中的实际文件,而应该只计算带有对象和其他元数据的
.git
,因为捆绑包将包含这些对象和元数据,而不是原始形式的文件


对于备份,您可以使用
git clone--mirror
选项,也可以像以前一样归档repo。捆绑包不是回购的可行备份选项,因为您将丢失配置、reflog、过时对象等。

我认为git使用zlib进行压缩

然而,就大小而言,
zip
并不是最好的归档格式
zlib
用于进一步缩小尺寸,具体如下(感谢维基百科):

增量编码是一种以顺序数据(而不是完整文件)之间的差异形式存储或传输数据的方法


这可能是您的文件太小的原因。我在排出的git bundle上尝试了一个
文件
,它说bundle只是原始数据。

我认为
git bundle
不是维护存储库备份的好主意。创建一个裸存储库,并将您希望在备份中跟踪的引用推到该存储库上,或者使用好的旧tarball。两者之间的区别在于,推送只允许您备份选择性分支。例如,您可能希望忽略备份中的临时分支。压缩存储库将直接备份所有内容,包括您的存储、未跟踪文件、对象文件和任何临时编辑器文件


我通常只是把整件事都拉上拉链。您可以运行
git clean-fdxn
,然后运行
git clean-fdx
,仔细清除存储库中未存储的所有内容。如果您在执行备份时确实坚持大小效率(您不应该这样做;让Git来担心这一点),那么您可以在备份之前进行垃圾收集,甚至可以删除reflog。但你知道,我不会。如今存储成本很低,这样做只会使备份的价值降低。

每个克隆都是存储库的完整副本。克隆它,你就有了一个备份——顺便说一句,它可以非常容易地得到更新。@KingCrunch:克隆并不是严格意义上的“副本”,因为分支结构是不同的。如果您想要一个真正的副本,您需要将--mirror标志添加到克隆中。这将使克隆的分支结构完全镜像原始分支结构。即使镜像也不是存储库目录的完全副本。你仍然会错过你在.git/config中的任何自定义设置,你仍然会错过隐藏你正在进行的任何工作,你的阶段区域——几乎所有没有记录在存储库中的东西。我认为你有点误传了。zlib压缩使用增量编码作为其工作方式的一部分(这基本上就是所有压缩的工作方式)。Git本身将完整的、未增量的文件作为对象存储在其repo中,然后依靠zlib执行增量压缩(Git也足够聪明,可以在执行增量打包时重用增量来加速操作)。哎哟。那么我猜它只是使用了
zlib