And*_*dyL 8 git bash shell windows-xp msysgit
Git对我的工作流程至关重要.我在带有3GB内存的四核机器上运行Windows XP上的MSYS Git,通常它具有响应性和灵活性.
突然出现一个问题,从Git Bash命令提示符运行任何命令需要> 30秒,包括ls或cd.有趣的是,从bash提示看起来喜欢ls运行得相当快,然后我可以看到输出ls,但是然后返回提示需要大约30秒.如果我切换到Windows命令提示符(通过cmd从开始菜单运行)git相关命令也需要永远,甚至只是运行.例如git status,在发生任何事情之前可能需要将近一分钟.有时这些过程根本无法完成.
请注意,我有"MSYS的Git"安装以及定期的"MSYS"对于喜欢的东西MinGW和make.
我认为问题与sh.exe位于C:\Program Files\Git\bin.当我ls从bash提示符运行时,或者当我git从Windows提示符调用时,任务管理器最多显示四个sh.exe进程的进程实例.
在这里,我等待ls返回,你可以看到任务管理器已经git.exe运行了四个实例sh.exe:

如果我ctrl-c在中间,ls我有时会得到包括以下内容的错误:
sh.exe": fork: Resource temporarily unavailable
0 [main] sh.exe" 1624 proc_subproc: Couldn't duplicate my handle<0x6FC> fo
r pid 6052, Win32 error 5
sh.exe": fork: Resource temporarily unavailable
Run Code Online (Sandbox Code Playgroud)
或者git status:for :git status
sh.exe": fork: Resource temporarily unavailable
sh.exe": fork: Resource temporarily unavailable
sh.exe": fork: Resource temporarily unavailable
sh.exe": fork: Resource temporarily unavailable
Run Code Online (Sandbox Code Playgroud)
我可以解决这个问题,以便git再次快速运行,如果是这样,怎么办?
我尝试过的事情:
我非常想不擦拭我的盒子并重新安装Windows,但如果我不能解决这个问题,我会的.我不能再代码,如果需要我> 30秒运行git status或cd.
通常当一个程序需要30秒才能做一些应该是瞬时的事情时,它更可能是I/O超时问题,通常是网络,而不是你的CPU速度或你拥有的RAM量.您可能想知道网络是如何参与的,但这是一个合理的问题(我也不知道您的系统).
Msysgit安装一个特殊的提示符,它运行一个特殊的函数__git_ps1,在提示符中显示一些有用的信息.您可以看到这个使用echo $PS1,对于我的系统,这显示:
$ echo $PS1
\[\033]0;$MSYSTEM:\w\007 \033[32m\]\u@\h \[\033[33m\w$(__git_ps1)\033[0m\] $
Run Code Online (Sandbox Code Playgroud)
这些额外信息是完全可选的,您可以将其关闭.因此,在Msysgit窗口中尝试以下操作:
$ PS1='$ '
$
Run Code Online (Sandbox Code Playgroud)
这会将提示重置为默认值,$而不是尝试在提示符内运行和命令.如果这解决了你的延迟问题,那么很可能就是这个__git_ps1功能.尝试手动运行:
$ __git_ps1
(master)
Run Code Online (Sandbox Code Playgroud)
并看看返回需要多长时间.
您可以通过删除__git_ps1从中调用的行来解决此问题C:\Program Files\Git\etc\profile:
#Comment the lines below
#PS1='\[\033]0;$MSYSTEM:\w\007
#\033[32m\]\u@\h \[\033[33m\w$(__git_ps1)\033[0m\]
#$ '
Run Code Online (Sandbox Code Playgroud)
所以我们也遇到了这个问题,我想我们最终将其追溯到msys的Windows安全模型的实现.我将尝试发布该问题的简短摘要:
截图:
堆栈的卡住sh.exe的痕迹.注意当msys-1.0.dll调用NetServerEnum()时
这是当sh.exe被阻止30秒时发生的事情.因此NetServerEnum()只msys在一个地方调用,security.cc:228 in get_lsa_srv_inf(),由get_logon_server()and 调用,get_logon_server_and_user_domain()调用in create_token(),由seteuid()syscalls.cc调用,调用方式为setuid().
因此,最初发生的是当msys DLL初始化并且sh.exe试图调用时setuid(),msys尝试忠实地遵守Windows安全模型并尝试从您的域/工作组中查找域服务器列表.不幸的是,与Linux不同,对于Windows来说,这是一个阻塞调用,需要5到30秒才能完成/超时,而实际上git是不必要的.
我们的解决方案是创建一个安全的"功能"通过设置禁用新msys.dll has_security在winsup.cc为false.msysgit附带的bash/sh.exe与我们新版本的msys.dll不兼容,所以我们不得不从头开始编译一个新的bash.exe,不明白为什么.最终结果是sh.exe不再尝试进行这些NetServerEnum调用并运行lickity split.
| 归档时间: |
|
| 查看次数: |
10804 次 |
| 最近记录: |