git status命令非常缓慢

4

最近我的git status命令变得很慢。

我尝试追踪执行过程:

GIT_TRACE=1 GIT_CURL_VERBOSE=2 git status

输出:

10:24:26.589696 run-command.c:640       trace: run_command: GIT_INDEX_FILE=.git/index git submodule summary --cached --for-status --summary-limit 1 HEAD
10:24:26.611043 git.c:576               trace: exec: git-submodule summary --cached --for-status --summary-limit 1 HEAD
10:24:26.611744 run-command.c:640       trace: run_command: git-submodule summary --cached --for-status --summary-limit 1 HEAD
10:24:26.688245 git.c:576               trace: exec: git-sh-i18n--envsubst --variables 'usage: $dashless $USAGE'
10:24:26.688921 run-command.c:640       trace: run_command: git-sh-i18n--envsubst --variables 'usage: $dashless $USAGE'
10:24:26.712823 git.c:576               trace: exec: git-sh-i18n--envsubst 'usage: $dashless $USAGE'
10:24:26.713851 run-command.c:640       trace: run_command: git-sh-i18n--envsubst 'usage: $dashless $USAGE'
10:24:26.754163 git.c:344               trace: built-in: git rev-parse --git-dir
10:24:26.773008 git.c:344               trace: built-in: git rev-parse --git-path objects
10:24:26.788905 git.c:344               trace: built-in: git rev-parse -q --git-dir
10:24:26.832189 git.c:344               trace: built-in: git rev-parse --show-prefix
10:24:26.847857 git.c:344               trace: built-in: git rev-parse --show-toplevel
10:24:26.865076 git.c:344               trace: built-in: git rev-parse -q --verify --default HEAD HEAD
10:24:26.887339 git.c:344               trace: built-in: git rev-parse --show-toplevel
10:24:26.901182 git.c:344               trace: built-in: git rev-parse --sq --prefix  --
10:24:26.927138 git.c:344               trace: built-in: git diff-index --cached --ignore-submodules=dirty --raw d6f45eab9517deee0ad8c898ec74b6ce876ba9eb --
10:24:26.941160 run-command.c:640       trace: run_command: GIT_INDEX_FILE=.git/index git submodule summary --files --for-status --summary-limit 1
10:24:26.962172 git.c:576               trace: exec: git-submodule summary --files --for-status --summary-limit 1
10:24:26.962895 run-command.c:640       trace: run_command: git-submodule summary --files --for-status --summary-limit 1
10:24:37.013868 git.c:576               trace: exec: git-sh-i18n--envsubst --variables 'usage: $dashless $USAGE'
10:24:37.014548 run-command.c:640       trace: run_command: git-sh-i18n--envsubst --variables 'usage: $dashless $USAGE'
10:24:37.035160 git.c:576               trace: exec: git-sh-i18n--envsubst 'usage: $dashless $USAGE'
10:24:37.035863 run-command.c:640       trace: run_command: git-sh-i18n--envsubst 'usage: $dashless $USAGE'
10:24:37.064778 git.c:344               trace: built-in: git rev-parse --git-dir
10:24:37.088144 git.c:344               trace: built-in: git rev-parse --git-path objects
10:24:37.106468 git.c:344               trace: built-in: git rev-parse -q --git-dir
10:24:37.144214 git.c:344               trace: built-in: git rev-parse --show-prefix
10:24:37.163255 git.c:344               trace: built-in: git rev-parse --show-toplevel
10:24:37.184273 git.c:344               trace: built-in: git rev-parse -q --verify --default HEAD
10:24:37.201302 git.c:344               trace: built-in: git rev-parse --show-toplevel
10:24:37.220281 git.c:344               trace: built-in: git rev-parse --sq --prefix  --
10:24:37.249722 git.c:344               trace: built-in: git diff-files --ignore-submodules=dirty --raw --

我发现这两个步骤需要花费10秒钟:

10:24:26.962895 run-command.c:640       trace: run_command: git-submodule summary --files --for-status --summary-limit 1
10:24:37.013868 git.c:576               trace: exec: git-sh-i18n--envsubst --variables 'usage: $dashless $USAGE'

我的Git环境:

  • macOS 10.13.4 (17E199)
  • Git版本2.17.0

有没有人遇到同样的问题?我对Git的细节不太熟悉。


你的代码库是否有未提交的更改?暂存区呢?有多少文件被跟踪了?你尝试过 git gc 吗? - Gonzalo Matheu
如果您在运行子模块命令时定义了GIT_TRACE,可能会获得更多详细信息。 - max630
2个回答

7
对于您没有跟踪的文件,请参阅与git status相关的“未跟踪的文件和性能”。首先尝试检查子模块的存在是否会影响git status的性能,使用--ignore-submodules[=<when>]选项。
git status --ignore-submodules=all

此外,请确保你的代码库是在本地克隆的,而不是在远程驱动器上,否则它将会增加任何Git操作的延迟。

1
谢谢@VonC,通过添加--ignore-submodules=all,它可以正常工作!但是为什么检查子模块很慢? - Evans Y.
@EvansY。默认情况下,git始终检查子模块状态,但您可以配置忽略它们。 - VonC
1
你可以尝试切换到子仓库的目录,并像在顶级仓库中一样发出相同的分析命令。 - Rudi

4

那个链接是2015年的,现在已经不相关了。目前正在解决当前的性能问题,例如在https://github.com/git-for-windows/git/issues/1533#issuecomment-384259846中。... 不过这是针对Git for Windows的(OP使用的是Mac)。 - VonC

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