git - 版本控制系统是否使用差异来存储二进制文件?

标签 git svn version-control

流行的版本控制系统(svn、git)如何处理存储对二进制文档的修订?我的项目包含定期更新并需要 checkin 的二进制源(主要是 Photoshop 文档、自定义数据格式和一些文字处理文档)。我一直担心 checkin 二进制文件,因为我认为 VCS 可能会采取一种简单的方式,每次只上传一份新的二进制文件副本 - 因此我的存储库会很快变得庞大。

如果我有几个数据 block (我们称它们为 A、B、C、D 等)并且我有一个二进制文件,在第一次 checkin 时看起来像 ABC,但在第二次 checkin 时已被修改为 ADBE ,我的 VCS 是否足够智能以仅存储更改的位,还是会创建文件的全新图像?

最佳答案

tl;博士

Git 只能存储二进制文件的差异,但效率不高,因此您可能应该使用一些外部工具,如 lfs .

稍微长一点的解释

默认情况下,git 不存储提交之间的差异。当您更改某个文件并进行新提交时,git 会存储包含整个文件内容的对象。只更改一行或重写整个文件都没关系 - git 不存储差异,至少一开始是这样。有一个名为 git-gc 的 git (垃圾收集器)负责删除悬空提交和优化等任务,它运行另一个 git 命令 - git-repack这正是你所要求的。它获取所有对象并使用增量压缩将它们存储在一个包中。

不幸的是,在压缩二进制文件时,使用 git-repack 打包并不是特别有效。你可以随时 tweak it , 但如果你的文件变化很大,或者它们真的很大,你应该使用一些外部工具,比如 lfs .

关于git - 版本控制系统是否使用差异来存储二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39522863/

相关文章:

ios - Xcode git 显示多个存储库

svn - Subversion 文件夹和文件规范

svn - 如何删除文件夹的 Subversion 控制?

git - 如何将多个配置键值对传递给 git clone?

git - 为什么限制分支删除 (Git)?

svn - 如何在 Windows Azure 实例上设置 VisualSVN 安装程序

svn - 是否可以将 "append"修订版从一个颠覆存储库转移到另一个?

c++ - 如何在 Visual C++ Express 2010 中创建一个项目的多个版本

git - 使用 Subversion 后学习 Git

git - 当我尝试从 azure git 进行 git clone 时如何进行身份验证?