Git的内存使用

Git's memory usage

创建包含一些二进制文件的存储库后(是的 git 确实不能很好地处理二进制文件,但这是一个二进制文件是必需文件的存储库),执行提交变得有点臃肿.

当执行 commit 时,git 的内存使用量达到 2.7 GiB。有时进程甚至会被操作系统杀死,因为它使用了所有剩余的系统资源。

这可能是由于内部使用的diff算法需要同时考虑原始文件和新文件,并且需要至少将其中一个文件存入内存(第二个可以处理作为 ).

是否可以将文件标记二进制并指定存储库不需要计算差异,而只检查新版本(这可以通过将两个文件作为流处理来完成,因此在常量内存中)。毕竟,存储差异可能和复制新版本一样低效。

git 存储库在机器上自动维护。因此,如果该过程可以自动化并因此使用例如文件的 MIME 类型并自动标记所有二进制文件,那就太好了。

如“Exclude a directory from git diff”中所述,您可以使用 .gitattributes 指令 '-diff':

从 diff 中排除 files/folders
lib/* -diff
dist/js/**/*.js -diff

为了避免由于 git 差异导致的任何内存不足问题,您还需要 since Git v2.2.0 (mid 2014) the configuration core.bigfilethreshold.
(还有 default size for a pack file has been raised)。

最后,其他功能如 GVFS (Git Virtual File System, 2017) will improve that kind of issue, and already allows Microsoft to manage the largest Git repository on the planet(Windows 代码库一,大约 350 万个文件,约 300GB,除了数千个拉取请求验证外,还有 440 个分支机构每天 1,760 个“实验室构建”构建)。此功能尚未完全集成到 Git,但说明了可能性。