Git索引和提交很慢

Posted

技术标签:

【中文标题】Git索引和提交很慢【英文标题】:Git index and commit is very slow 【发布时间】:2020-05-05 20:18:17 【问题描述】:

我有一个本地 git 存储库并使用 git add file1 file2 file3... 将我的修改添加到 git 索引。之后我使用普通的git commit。每个命令大约需要 3 到 6 秒。我的存储库有大约 150.000 次提交。

我已经执行了git gc,因为我认为它会执行一些垃圾收集。 SSD 相当快。我想知道我可以在 git 中打开哪些螺丝来加速这两个命令的执行。有什么建议吗?

git version 2.21.0 (Apple Git-122.2)

我的系统是装有 MacOS 10.14.6 的 Mac Pro。我使用带有APFS 的SSD。未安装防病毒软件(或任何其他干扰扫描软件)。

【问题讨论】:

提交的数量不应该有区别,但被更改的文件数量可能会有所不同。你要添加多少文件? git addgit commit 都需要 3 到 6 秒,还是只是 git commit?像git loggit diff 这样的其他推荐也很慢吗? 您可以运行 GIT_TRACE_PERFORMANCE=1 git <cmd> 来查看 Git 将时间花在哪里。 并且还更新了 git,因为每个版本都引入了性能改进,尤其是对于大型存储库... 您要添加什么样的文件?每当您进行提交时,Git 都会使用 zlib 压缩对象,如果您的文件是二进制对象,那么这种压缩将消耗一些 CPU 周期。出于这个原因,git 真的应该只与文本文件一起使用。如果要添加图像、媒体、应用程序二进制文件/档案等二进制对象,则应使用 git-lfs 以便 git 可以将这些未压缩的对象存储在单独的位置。 【参考方案1】:

首先,更新到最新的 Git 2.25:每个新版本都解决了性能问题。

要调查性能问题,请将GIT_TRACE2_PERF 环境变量设置为1 并运行git 命令。 See this SO answer for details about the trace2 feature and how to interpret the output table.

(在 Bash 中 you can set a variable and run a command in the same line)

GIT_TRACE2_PERF=1 git commit -m "test"

在 Windows 命令提示符中,您需要使用 SET:

SET GIT_TRACE2_PERF=1
git commit -m "test"

或者,在CMD in one line:

cmd /V /C "SET "GIT_TRACE2_PERF=1" && git commit -m "test""

例如,在 Windows 上,您会看到如下所示的输出:

C:\git\me\foobar>SET GIT_TRACE2_PERF=1

C:\git\me\foobar>git status
17:23:13.056175 common-main.c:48             | d0 | main                     | version      |     |           |           |              | 2.31.1.windows.1
17:23:13.056175 common-main.c:49             | d0 | main                     | start        |     |  0.003356 |           |              | git.exe status
17:23:13.065174 ..._win32_process_info.c:118 | d0 | main                     | data_json    | r0  |  0.012053 |  0.012053 | process      | windows/ancestry:["git.exe","cmd.exe","explorer.exe"]
17:23:13.066174 repository.c:130             | d0 | main                     | def_repo     | r1  |           |           |              | worktree:C:/git/me/foobar
17:23:13.067174 git.c:448                    | d0 | main                     | cmd_name     |     |           |           |              | status (status)
17:23:13.068174 read-cache.c:2324            | d0 | main                     | region_enter | r1  |  0.015462 |           | index        | label:do_read_index .git/index
17:23:13.069175 cache-tree.c:598             | d0 | main                     | region_enter | r1  |  0.015809 |           | cache_tree   | ..label:read
17:23:13.069175 cache-tree.c:600             | d0 | main                     | region_leave | r1  |  0.016021 |  0.000212 | cache_tree   | ..label:read
17:23:13.069175 read-cache.c:2284            | d0 | main                     | data         | r1  |  0.016056 |  0.000594 | index        | ..read/version:2
17:23:13.069175 read-cache.c:2286            | d0 | main                     | data         | r1  |  0.016065 |  0.000603 | index        | ..read/cache_nr:3808
17:23:13.069175 read-cache.c:2329            | d0 | main                     | region_leave | r1  |  0.016072 |  0.000610 | index        | label:do_read_index .git/index

注意最左列的挂钟时间,第 7 列自开始以来的总时间,第 8 列每个子操作的总时间。

【讨论】:

以上是关于Git索引和提交很慢的主要内容,如果未能解决你的问题,请参考以下文章

Git基础教程详解

使用 Git 时如何解决“错误:错误索引 – 致命:索引文件损坏”

使用 Git 检查脏索引或未跟踪文件

GIT版本管理

如何在不使用 git 的情况下查看 git 对象和索引

Git reset命令的使用