git stash在windows上运行缓慢

y0u0uwnf  于 2022-12-10  发布在  Git
关注(0)|答案(2)|浏览(151)

在我的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秒的时间。

bz4sfanl

bz4sfanl1#

Git for Windows 2.19(2018年9月)中,git stash(和git rebase)不再是纯脚本的,而是实际上用git.exe编译的二进制文件。
请参阅git-for-windows/build-extra PR 203
要激活它们,请键入:

git config --global rebase.useBuiltin true
git config --global stash.useBuiltin true
    • 警告**:

尽管加速效果很好,但有问题的补丁仍在不断变化,而且它们根本没有经过战斗测试。
因此,目前git stash的脚本版本仍为默认版本,即:

  • 如果用户希望通过三个并行工作的GoogleSummerofCode项目获得原始速度的提高,
  • 而其他不愿意只运行经过良好测试的代码来做试验的人则可以安全地呆在那里。

重点仍然是:在Git的下一个版本中,git-stash的bash脚本将最终消失,它的替代品将更快。
注:下一个版本将是Git 2.27(2020年第二季度):"git stash"保留了一个转义窗口,以便在一些版本中使用脚本版本,这些版本已经过时。
它已被删除。
参见Thomas Gummerer ( tgummerer )commit 8a2cd3fcommit 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 40af146commit 48ee24acommit ef0f0b4commit 64fe9c2commit 1ac528ccommit d553f53commit d4788afcommit 41e0dd5commit dc7bd38commit 130f269commit bef55dccommit dac566ccommit dc7bd38commit dc7bd38commit dc7bd38commit dc7bd38commit dc7bd38commit dc7bd38commit dc7bd38commit dc7bd38commit dc7bd38commit dc7bd38commit dc7bd38commit dc7bd38commit dc7bd38commit dc7bd38commit dc7bd38、x1e20(2019年2月25日)由Paul-Sebastian Ungureanu ( weekly-digest[bot] )发布。
请参见commit c4de61dcommit 577c199commit 4e2dd39commit 8a0fc8d(2019年2月25日),作者为Joel Teichroeb ( klusark )
参见Johannes Schindelin ( dscho )commit 7906af0commit 90a4627commit 8d8e9c2(2019年2月25日)。
(2019年4月22日由Junio C Hamano -- gitster --合并至commit e36adf7
你还是可以的。
还有:
我的天
旧的shell脚本git-stash.sh被删除并完全替换为builtin/stash.c
为此,createpush被调整为在没有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()中的一个或多个。
以下是pushcreate的调用链:

  • 一个月五个月一个月一个月-〉一个月五个月一个月-〉一个月五个月三个月一个月
  • 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 e9b272ecommit deeaf5ecommit 5d4dc38commit 6de0722(2022年1月27日),作者为Johannes Schindelin ( dscho )
(2022年2月16日,由commit b9f791acommit b9f791a中合并)

  • -停止关于过时的stash.useBuiltin配置设置的警告
    签署人:约翰内斯·申德林
    8a2cd3f("stash:2020 - 03 - 03,Git v2.27.0-rc0--merge列在batch #2中),我们移除了对stash.useBuiltin的支持,但在其位置留下了一个警告。
    经过近两年的时间和几个主要版本,现在是时候删除甚至警告。
xn1cxnb4

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运行它(此处为:猛击):

# the git-core/ dir needs to be in the PATH,
# obviously  you will need to provide the correct path for your git-core dir

$ PATH=/usr/lib/git-core:$PATH bash /usr/lib/git-core/git-stash

您还可以打开-x标志,它将输出所有已执行命令的跟踪,并直观地检查是否有一个子命令看起来是挂起器:

$ PATH=/usr/lib/git-core:$PATH bash -x /usr/lib/git-core/git-stash

相关问题