Bash-completion is very slow on MSYS2 when the current user is a domain user. This describes the cause and the solutions.
Expansion of ~*
is very slow when you use a domain user. For example:
$ time echo ~*
~*
real 0m23.151s
user 0m0.000s
sys 0m0.000s
When the tab key is pressed, bash-completion tries to evaluate ~*
. That's
why bash-completion is slow.
~*
is used inside /usr/share/bash-completion/bash_completion
.
Disabling it can solve the problem.
--- /usr/share/bash-completion/bash_completion.org
+++ /usr/share/bash-completion/bash_completion
@@ -542,9 +542,9 @@
elif [[ $1 == \'* ]]; then
# Leave out first character
printf -v $2 %s "${1:1}"
- elif [[ $1 == ~* ]]; then
- # avoid escaping first ~
- printf -v $2 ~%q "${1:1}"
+ #elif [[ $1 == ~* ]]; then
+ # # avoid escaping first ~
+ # printf -v $2 ~%q "${1:1}"
else
printf -v $2 %q "$1"
fi
MSYS2 obtains the user information from the system database (in Windows) by default, but it is very slow when the current user is a domain user. Disabling it and make MSYS2 to obtain the user information from files solves the problem.
First you need to create /etc/passwd
and /etc/group
with the information
of the local users (-l
) and the current (domain) user (-c
).
$ mkpasswd -l -c > /etc/passwd
$ mkgroup -l -c > /etc/group
Then you need to modify /etc/nsswitch.conf
to disable db
from group
and
passwd
.
--- /etc/nsswitch.conf.org
+++ /etc/nsswitch.conf
@@ -1,7 +1,7 @@
# Begin /etc/nsswitch.conf
-passwd: files db
-group: files db
+passwd: files #db
+group: files #db
db_enum: cache builtin
If you don't update /etc/passwd
and /etc/group
properly, bash prompt might
show your account as Unknown+User
.
See also:
man 5 nsswitch.conf
on Linux- msys2/MSYS2-packages#138 (comment)
Thank you for this, it makes it possible to get things done with git when stuck
in a domain.
Note: This will only work for the user that executes mkpasswd/mkgroup,
since it's the current user that appears in the output. I ran into trouble
recently because of this: git-for-windows/git#1684
Note 2: Unfortunately, /etc/nsswitch.conf gets replaced on every
upgrade in Git for Windows, so this has to be done after each one.
I put that part in a sed script and added to the mk commands. This way, it can
just be executed after every GFW upgrade, to prevent the db requests.