重新打包存储库对于大型二进制文件有用吗?

2024-05-15

我正在尝试将大量历史记录从 Perforce 转换为 Git,并且一个文件夹(现在是 git 分支)包含大量大型二进制文件。我的问题是运行时内存不足git gc --aggressive.

我的主要问题是重新打包存储库是否可能对大型二进制文件产生任何有意义的影响。如果再压缩 20% 那就太好了。 0.2% 不值得我付出努力。如果没有,我会按照建议跳过它们here https://stackoverflow.com/a/8686576.

对于背景,我成功地使用了git p4以我满意的状态创建存储库,但这使用git fast-import在幕后,所以我想在正式发布之前优化存储库,并且确实使任何提交自动触发缓慢gc --auto。目前裸露状态约为 35GB。

从概念上讲,所讨论的二进制文件似乎是嵌入式设备中使用的供应商固件。我认为大约有 25 个在 400-700MB 范围内,也许还有几百个在 20-50MB 范围内。它们可能是磁盘映像,但我不确定。随着时间的推移,出现了各种各样的版本和文件类型,我发现.zip, tgz, and .simg经常归档。因此,我预计原始代码会有很大的重叠,但我不确定此时实际文件有多相似,因为我相信这些格式已经被压缩了,对吗?

这些二进制文件包含在一个(旧)分支中,该分支很少使用(以至于质疑版本控制是否有效,但超出了范围)。当然,该分支的性能不需要很好。但我希望存储库的其余部分是合理的。

欢迎提供有关最佳打包或内存管理的其他建议。我承认我不太理解链接问题上讨论的各种 git 选项。我也不太明白什么是--window and --depth旗帜正在做git repack。但主要问题是二进制文件本身的重新打包是否有任何意义。


我的主要问题是重新打包存储库是否可能对大型二进制文件产生任何有意义的影响。

这取决于它们的内容。对于您特别概述的文件:

我经常看到 .zip、tgz 和 .simg 文件。

Zipfiles 和 tgz(gzipped tar archive)文件已经被压缩并且具有可怕的(即高)香农熵 https://en.wikipedia.org/wiki/Entropy_(information_theory)值——这对 Git 来说是可怕的——并且不会相互压缩。这.simg文件可能是(我必须在这里猜测)奇点磁盘映像文件 http://singularity.lbl.gov/docs-recipes;我不知道它们是否以及如何被压缩,但我假设它们是。 (一个简单的测试是将一个压缩器输入到压缩器,例如 gzip,然后看看它是否收缩。)

因此,我预计原始代码会有很大的重叠,但我不确定此时实际文件有多相似,因为我相信这些格式已经被压缩了,对吗?

恰恰。储存它们未压缩的因此,矛盾的是,Git 最终会导致更大的压缩。 (但打包可能需要大量内存。)

如果[这可能是徒劳的],我会按照建议跳过它们here https://stackoverflow.com/a/8686576.

这将是我来这里的第一个冲动。 :-)

我承认我不太理解链接问题上讨论的各种 git 选项。我也不太明白什么是--window and --depth旗帜正在做git repack.

各种限制令人困惑(而且数量众多)。同样重要的是要认识到它们不会在克隆上被复制,因为它们位于.git/config这不是已提交的文件,因此新的克隆不会拾取它们。这.gitattributes file is在克隆上复制,新克隆将继续避免打包不可打包的文件,因此这是更好的方法。

(If you care to dive into the details, you will find some in the Git technical documentation https://github.com/git/git/blob/master/Documentation/technical/pack-heuristics.txt. This does not discuss precisely what the window sizes are about, but it has to do with how much memory Git uses to memory-map object data when selecting objects that might compress well against each other. There are two: one for each individual mmap on one pack file, and one for the total aggregate mmap on all pack files. Not mentioned on your link: core.deltaBaseCacheLimit, which is how much memory will be used to hold delta bases—but to understand this you need to grok delta compression and delta chains,1 and read that same technical documentation. Note that Git will default to not attempting to pack any file object whose size exceeds core.bigFileThreshold. The various pack.* controls are a bit more complex: the packing is done multi-threaded to take advantage of all your CPUs if possible, and each thread can use a lot of memory. Limiting the number of threads limits total memory use: if one thread is going to use 256 MB, 8 threads are likely to use 8*256 = 2048 MB or 2 GB. The bitmaps mainly speed up fetching from busy servers.)


1They're not that complicated: a delta chain occurs when one object says "take object XYZ and apply these changes", but object XYZ itself says "take object PreXYZ and apply these changes". Object PreXYZ can also take another object, and so on. The delta base is the object at the bottom of this list.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重新打包存储库对于大型二进制文件有用吗? 的相关文章

  • 本地git,推送到tfs远程repo

    我厌倦了向我的队友解释使用 DVCS 相对于 CVCS 的好处 他们中的一些人害怕学习曲线 另一些人则看不出任何原因 因为对他们来说 这都是一样的 就我个人而言 我对 TFS 及其问题感到非常厌倦 每当我需要进行一些小的 修复 时 我都必须
  • 从 master 更改为新的默认分支 git

    这是一个场景 我们有一个默认的分支 Master 我们以此为基础 创建分支并向上推等等 我们现在创建了一个Develop分支Master并将其设置为默认开发分支 我想知道的是 我现在如何知道我的 git pull 命令是否通过命令行请求默认
  • 如何将普通的 Git 存储库转换为裸存储库?

    如何将 普通 Git 存储库转换为裸存储库 主要区别似乎是 在普通的 Git 存储库中 你有一个 git存储库内的文件夹 包含构成工作副本的所有相关数据和所有其他文件 在裸露的 Git 存储库中 没有工作副本和文件夹 我们称之为repo g
  • git Branch -d :致命 - 无法查找 HEAD 的提交对象

    假设我在一个裸存储库 远程 中 如果我尝试使用以下命令删除分支git branch d
  • 如何查看 github 的 SSH 密钥?

    我最近收到一封来自 Github 的电子邮件 要求我检查我的 SSH 密钥 请检查您的钥匙并确保您 认出他们 如果您有任何疑问 请拒绝钥匙并 上传新密钥 如何在 ubuntu 11 10 上使用 git 检查我的密钥 您可以按照 GitHu
  • git checkout 到分支需要很长时间

    我使用的是 Ubuntu 17 10 并且使用 git 版本 2 14 1 每当我从 master 创建一个分支并尝试签出它 或从它签出到 master 时 都会花费大量时间 大约几分钟 有时接近 10 分钟 确实 我有几 GB 的数据 但
  • 是否可以在 git 存储库之外添加和提交文件?

    我们的文本文件分布在系统的各个角落 我们计划将这些文件中所做的所有修改添加到 git 存储库中 每次对这些文件进行修改都是由脚本进行的 因此 我们计划向该脚本添加新命令 以将文件添加到 git 存储库 但是 这些修改是同时进行的 我们可以为
  • 如何解决 VS Code 中变基拉取的合并冲突?

    当我做一个git pull rebase 并且我的提交中存在合并冲突 我得到冲突差异视图 解决所有冲突并暂存文件 然后呢 我可以打开终端并运行git rebase continue但是 VS Code 中不应该有一个按钮来完成变基吗 只需使
  • Git:压缩 master 上提交的最简单方法[重复]

    这个问题在这里已经有答案了 可能的重复 如何使用 git 将最后 X 次提交压缩在一起 https stackoverflow com questions 5189560 how can i squash my last x commits
  • 致命:不是 git 存储库(或任何父目录):.git [重复]

    这个问题在这里已经有答案了 当我尝试推送 github com 上的现有存储库时 当我输入命令时 网站提示我将其输入终端 我收到了以下致命错误消息 Not a git repository or any of the parent dire
  • 致命:无法将 HEAD 解析为有效引用

    我正进入 状态fatal Failed to resolve HEAD as a valid ref 每当我尝试承诺时 我努力了 echo ref refs heads master gt git HEAD 但它不起作用 也尝试过 git
  • 未能将一些参考推送至 [email protected]

    当我尝试推送到 Heroku 存储库时收到此错误 我已经设置了autocrlf false在gitconfig中 但这个问题仍然存在 我也尝试过这个解决方案here https stackoverflow com questions 566
  • 无法使用 git 推送或获取 [重复]

    这个问题在这里已经有答案了 我可以拉 但无法使用 git 版本 1 9 5 推送或获取 它突然开始给我以下错误 关于如何修复它有什么想法吗 git fetch fatal unable to access https email prote
  • 缓冲后台输入流实现

    我已经写了背景InputStream and OutputStream 包装其他流并在后台线程上预读的实现 主要允许在处理解压缩流的不同线程中进行解压缩 压缩 这是一个相当标准的生产者 消费者模型 这似乎是一种利用多核 CPU 的简单方法
  • 如何让 Gitlab 运行程序在成功构建时将代码合并到分支中

    嗯 标题几乎是不言自明的 总之 如果构建成功 我希望将一个分支 即开发 合并到另一个分支 即生产 我尝试了 jakub kania 解决方案 但我总是得到id rsa invalid format 我认为 gitlab 秘密变量以某种方式被
  • 将 Visual Studio 在线 Git 存储库集成到 Android Studio 1.0.2

    我正在使用 Visual Studio Online 进行开发过程 我想将我的 Android Studio 1 0 2 代码集成到其中 但是 据我所知 Android Studio 没有 TFS 插件 这就是为什么我想使用 Git 进行源
  • 为别名命令添加“git help”?

    我已经实现了一个 Git 命令并使用 git 别名将其连接到 Git 但是有没有办法连接 Git 帮助 我在 Windows 上运行 如果我发出git help mycmd我收到一个弹出窗口 告诉我 Git 找不到 git mycmnd h
  • 尝试配置 GIT 时 Eclipse 没有响应

    Windows 10 专业版 64 位SSD金士顿 i5 4690Eclipse 版本 全部工作空间 空问题 每次我尝试配置 TEAM gt GIT gt 配置或尝试导入 创建本地 远程 git 时 Eclipse 都会冻结 直到我强制用任
  • GIT 和 Ruby:如何从 ruby​​ 脚本内部取消设置 GIT_DIR 变量?

    我编写了一个非常简单的 部署 脚本作为我的post update挂钩到我的裸 git 存储库中 变量如下 live domain mydomain com staging domain stage mydomain com git repo
  • 如何让 git 显示作者日期指定日期范围内的提交?

    显然this https stackoverflow com a 11189286 281545 git log all after

随机推荐