打包和压缩Git仓库有何区别?

8
当我执行一个
git bundle create ../`basename $PWD`.all.gitbundle --all

在一个Git代码库中,创建的捆绑文件大小约为4.8MB。当我压缩整个代码库文件夹时,生成的文件大小为26.2MB
基本上,我想找到一种备份整个代码库而不丢失任何信息的方法。但考虑到存档文件大小差异,我认为git bundle并不能备份所有内容或比简单的压缩更有效。
请问有人可以解释一下吗?

每个克隆都是存储库的完全副本。制作一个克隆并且你就有了一个备份 - 顺便说一句,这个备份可以非常容易地更新。 - KingCrunch
1
@KingCrunch:严格来说,一个克隆并不是一个“复制品”,因为分支结构是不同的。如果你想要一个真正的复制品,你需要在克隆中添加--mirror标志。这将使克隆的分支结构完全镜像原始的分支结构。 - Lily Ballard
1
即使是镜像也不是您存储库目录的完全副本。您仍将错过任何自定义设置,可能在您的.git / config中,您仍将错过您的stash和任何正在进行的工作,您的stage区域 - 几乎所有未记录在存储库中的内容。 - wilhelmtell
3个回答

1
"bundle" 命令将打包一切通常会通过 git push 推送的内容。

http://progit.org/2010/03/10/bundles.html

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

对于备份,您可以考虑使用 git clone --mirror 选项或仅存档仓库。bundle 不是 repo 的可行备份选项,因为您将丢失配置、reflog、过时的对象等。


1

我认为git使用zlib进行压缩。

zip在大小方面并不是最好的存档格式。zlib使用delta-compression进一步减小了文件大小,这是它的原理(感谢维基百科):

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

这可能解释了你的文件大小很小的原因。我尝试对生成的git捆绑包进行file操作,结果显示该捆绑包只是原始数据。


我认为你有些误解。zlib压缩使用增量编码作为其工作的一部分(这基本上是所有压缩的工作原理)。Git本身将完整的、未进行增量处理的文件存储为对象在其仓库中,然后依赖zlib执行增量压缩(Git也足够聪明,在执行增量打包以加快操作时重复使用增量)。 - Lily Ballard
糟糕,那我想它只是使用了“zlib”。 - Blender

1

我不认为使用git-bundle来维护您的存储库备份是一个好主意。要么创建一个裸仓库,并将您想要在备份中跟踪的 refs 推送到该仓库,要么使用好老旧的 tarballs。两者之间的区别在于推送允许您仅备份选择性分支。例如,您可能希望在备份中忽略暂存分支。压缩存储库会毫不保留地备份每一件事--包括您的 stash、未跟踪的文件、对象文件和任何临时编辑器文件。

我通常只是压缩整个存储库。您可以运行git-clean -fdxn,然后再运行git-clean -fdx,仔细清除您存储库中未存储的所有内容。如果您确实坚持在执行备份时进行大小效率(您不应该这样做;让 Git 自己处理这个问题),那么您可以在备份之前进行垃圾回收,甚至可以修剪您的 reflog。但是,您知道,我不会这样做。存储成本如今很便宜,而这样做只会导致备份价值的降低。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接