在我的windows机器上,git stash
每次调用大约有3.5秒的开销,这给我的git commit钩子增加了大约7秒的时间。
同样的命令在linux下(同一台机器)需要大约0.01秒。
我已经从this thread和这个线程尝试了以下内容:
- 将
core.fscache
设置为true
- 将
core.preloadindex
设置为true
- 将
gc.auto
设置为256
- 设置PS1 =“$”
- 在管理模式下运行cmd
- 在 cmd.exe 中运行,而不是在git-bash中运行
运行GIT_TRACE=true git stash list
16:58:16.844591 git.c:563 trace: exec: 'git-stash' 'list'
16:58:16.844591 run-command.c:336 trace: run_command: 'git-stash' 'list'
16:58:19.699591 git.c:350 trace: built-in: git 'rev-parse' '--git-dir'
16:58:19.859591 git.c:350 trace: built-in: git 'rev-parse' '--git-path' 'objects'
16:58:20.069591 git.c:350 trace: built-in: git 'rev-parse' '--show-toplevel'
16:58:20.154591 git.c:350 trace: built-in: git 'rev-parse' '--git-path' 'index'
16:58:20.244591 git.c:350 trace: built-in: git 'config' '--get-colorbool' 'color.interactive'
16:58:20.334591 git.c:350 trace: built-in: git 'config' '--get-color' 'color.interactive.help' 'red bold'
16:58:20.424591 git.c:350 trace: built-in: git 'config' '--get-color' '' 'reset'
16:58:20.514591 git.c:350 trace: built-in: git 'rev-parse' '--verify' '--quiet' 'refs/stash'
real 0m3.845s
user 0m0.000s
sys 0m0.047s
运行GIT_TRACE_PERFORMANCE=true git stash list
16:59:18.414591 trace.c:420 performance: 0.001078046 s: git command: 'C:\Program Files\Git\mingw64\libexec\git-core\git.exe' 'rev-parse' '--git-dir'
16:59:18.569591 trace.c:420 performance: 0.000947184 s: git command: 'C:\Program Files\Git\mingw64\libexec\git-core\git.exe' 'rev-parse' '--git-path' 'objects'
16:59:18.779591 trace.c:420 performance: 0.001253627 s: git command: 'C:\Program Files\Git\mingw64\libexec\git-core\git.exe' 'rev-parse' '--show-toplevel'
16:59:18.869591 trace.c:420 performance: 0.001285517 s: git command: 'C:\Program Files\Git\mingw64\libexec\git-core\git.exe' 'rev-parse' '--git-path' 'index'
16:59:18.955591 trace.c:420 performance: 0.001139994 s: git command: 'C:\Program Files\Git\mingw64\libexec\git-core\git.exe' 'config' '--get-colorbool' 'color.interactive'
16:59:19.040591 trace.c:420 performance: 0.001182881 s: git command: 'C:\Program Files\Git\mingw64\libexec\git-core\git.exe' 'config' '--get-color' 'color.interactive.help' 'red bold'
16:59:19.125591 trace.c:420 performance: 0.001128997 s: git command: 'C:\Program Files\Git\mingw64\libexec\git-core\git.exe' 'config' '--get-color' '' 'reset'
16:59:19.215591 trace.c:420 performance: 0.001567766 s: git command: 'C:\Program Files\Git\mingw64\libexec\git-core\git.exe' 'rev-parse' '--verify' '--quiet' 'refs/stash'
16:59:19.295591 trace.c:420 performance: 3.730583540 s: git command: 'C:\Program Files\Git\mingw64\bin\git.exe' 'stash' 'list'
real 0m3.819s
user 0m0.000s
sys 0m0.062s
从日志中我们可以看到,从git-stash命令运行到git-rev-parse命令运行大约需要3秒的时间。
2条答案
按热度按时间bz4sfanl1#
在Git for Windows 2.19(2018年9月)中,
git stash
(和git rebase
)不再是纯脚本的,而是实际上用git.exe
编译的二进制文件。请参阅git-for-windows/build-extra PR 203。
要激活它们,请键入:
尽管加速效果很好,但有问题的补丁仍在不断变化,而且它们根本没有经过战斗测试。
因此,目前
git stash
的脚本版本仍为默认版本,即:重点仍然是:在Git的下一个版本中,
git-stash
的bash脚本将最终消失,它的替代品将更快。注:下一个版本将是Git 2.27(2020年第二季度):"
git stash
"保留了一个转义窗口,以便在一些版本中使用脚本版本,这些版本已经过时。它已被删除。
参见Thomas Gummerer (
tgummerer
)的commit 8a2cd3f、commit b0c7362(2020年3月3日)。(2020年3月27日由Junio C Hamano --
gitster
--合并至commit 369ae75)我的天啊!删除
stash.useBuiltin
设置签署人:托马斯·古默勒
删除
stash.useBuiltin
设置,该设置是作为一个逃生出口添加的,以禁用Git 2.22首次发布的内置版本stash。携带遗留版本是一个维护负担,事实上,从2.23版本开始,测试失败已经过时了,直到现在还没有人注意到。
因此,用户将得到一个提示,回到一个潜在的缺陷版本的工具。
我们过去常常使用
git config
来获取useBuiltin
配置,以避免在生成legacy-stash之前更改任何全局状态。然而,这不再是必要的,所以只需使用'
git_config
'函数来获取设置。类似于我们在d03ebd411c中所做的("
rebase
:remove the rebase. useBuiltin setting ",2019 - 03 - 18,Git v2.22.0-rc0--merge listed in batch #5),我们移除了相应的rebase设置,我们保留了文档,这样人们在在线搜索时可以回头参考它,这样我们就可以在提交消息中引用它。请参阅commit 40af146、commit 48ee24a、commit ef0f0b4、commit 64fe9c2、commit 1ac528c、commit d553f53、commit d4788af、commit 41e0dd5、commit dc7bd38、commit 130f269、commit bef55dc、commit dac566c、commit dc7bd38、commit dc7bd38、commit dc7bd38、commit dc7bd38、commit dc7bd38、commit dc7bd38、commit dc7bd38、commit dc7bd38、commit dc7bd38、commit dc7bd38、commit dc7bd38、commit dc7bd38、commit dc7bd38、commit dc7bd38、commit dc7bd38、x1e20(2019年2月25日)由Paul-Sebastian Ungureanu (
weekly-digest[bot]
)发布。请参见commit c4de61d、commit 577c199、commit 4e2dd39和commit 8a0fc8d(2019年2月25日),作者为Joel Teichroeb (
klusark
)。参见Johannes Schindelin (
dscho
)的commit 7906af0、commit 90a4627、commit 8d8e9c2(2019年2月25日)。(2019年4月22日由Junio C Hamano --
gitster
--合并至commit e36adf7)你还是可以的。
还有:
我的天
旧的shell脚本
git-stash.sh
被删除并完全替换为builtin/stash.c
。为此,
create
和push
被调整为在没有stash.sh
的情况下工作。例如,在这次提交之前,
git stash create
调用了git stash--helper create --message "$*"
,如果它调用了git stash--helper create "$@"
,那么这些修改就没有必要了。此提交还删除了单词
helper
,因为现在stash是直接调用的,而不是由shell脚本调用的。优化措施包括:
我的天
这种提交通过避免再次调用相同的函数引入了优化。
例如,
git stash push -u
会在某些点呼叫下列函式:check_changes()
(内部do_push_stash()
)do_create_stash()
,它调用:check_changes()
和get_untracked_files()
请注意,
check_changes()
也会呼叫get_untracked_files()
。因此,
check_changes()
被调用2次,get_untracked_files()
被调用3次。旧函数
check_changes()
现在由两个函数组成:get_untracked_files()
和check_changes_tracked_files()
中的一个或多个。以下是
push
和create
的调用链:create_stash()
-〉do_create_stash()
为了防止重复调用相同的函数,
do_create_stash()
中的check_changes()
现在被放置在调用函数中(create_stash()
和do_push_stash()
)。这样,
check_changes()
和get_untracked files()
只被调用一次。在Git 2.36(Q2 2022)中,警告"
the stash.useBuiltin support has been removed!
"的移除终于完成了!请参见commit e9b272e、commit deeaf5e、commit 5d4dc38、commit 6de0722(2022年1月27日),作者为Johannes Schindelin (
dscho
)。(2022年2月16日,由commit b9f791a在commit b9f791a中合并)
stash.useBuiltin
配置设置的警告签署人:约翰内斯·申德林
在8a2cd3f("
stash
:2020 - 03 - 03,Git v2.27.0-rc0--merge列在batch #2中),我们移除了对stash.useBuiltin
的支持,但在其位置留下了一个警告。经过近两年的时间和几个主要版本,现在是时候删除甚至警告。
xn1cxnb42#
[更新]正如VonC在他的回答中提到的:
从git 2.19(2018年9月)开始,
git stash
是一个内置命令,不再是一个外部脚本。如果您使用的是
git
2.19或更高版本,则以下说明不再适用。git-stash
是一个脚本,而不是以git.exe
二进制文件编译的命令。在linux上:我可以在
/usr/lib/git-core/git-stash
上找到git-stash
-我会让你在windows上寻找正确的路径...这个脚本使用
#!/bin/sh
来运行,我不知道当你在Windows上运行这个脚本时使用了什么shell实现。您可以尝试使用另一个兼容的shell运行它(此处为:猛击):
您还可以打开
-x
标志,它将输出所有已执行命令的跟踪,并直观地检查是否有一个子命令看起来是挂起器: