windows - tutorial - git stash untracked files
git stash es lento en windows (2)
En mi máquina Windows,
git stash
tiene aproximadamente 3.5 segundos de sobrecarga en cada invocación, lo que agrega aproximadamente 7 segundos a mi git commit hook.
El mismo comando en Linux (misma máquina) tarda aproximadamente 0,01 segundos. El problema de rendimiento también se aplica a los repositorios vacíos.
He intentado lo siguiente de este hilo y este hilo :
-
core.fscache
se establece entrue
-
core.preloadindex
se establece entrue
-
gc.auto
se establece en256
- Configuración de PS1 = ''$''
- Ejecutar cmd en modo de administración
- Ejecutando dentro de cmd.exe en lugar de git-bash
Ejecutando
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
Ejecutando
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
Desde el registro vemos que se necesitan alrededor de 3 segundos entre la ejecución del comando git-stash y la ejecución de git-rev-parse. ¿Hay otras banderas que pueda ejecutar para encontrar el cuello de botella?
Con
Git para Windows 2.19
(septiembre de 2018),
git stash
(y
git rebase
) ya no son solo scripts, sino un binario compilado con
git.exe
.
Ver
git-for-windows / build-extra PR 203
.
Para activarlos, escriba:
git config --global rebase.useBuiltin true
git config --global stash.useBuiltin true
Advertencia :
A pesar de lo agradables que son las aceleraciones, los parches en cuestión todavía están cambiando y no se han probado en absoluto.
Entonces, por ahora, la versión de script de
git stash
sigue siendo la predeterminada, de esa manera:
- los usuarios que desean la mejora de velocidad sin procesar que obtuvimos a través de tres proyectos de Google Summer of Code trabajando en paralelo pueden tener eso,
- mientras que otros que son reacios a jugar al conejillo de indias ejecutando solo un código bien probado pueden mantenerse seguros.
El punto sigue siendo: en las próximas versiones de Git, el script bash para
git-stash
eventualmente desaparecerá, y su reemplazo es y será más rápido.
Actualización Q2 2019, con Git 2.22,
git stash
se reescribe por completo en C.
Ver
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 ab8ad46
(25 de febrero de 2019) por
Paul-Sebastian
Ungure
(
Paul Un Sebastian)
weekly-digest[bot]
)
.
Ver
commit c4de61d
,
commit 577c199
,
commit 4e2dd39
,
commit 8a0fc8d
(25 de febrero de 2019) por
Joel Teichroeb (
klusark
)
.
Ver
commit 7906af0
,
commit 90a4627
,
commit 8d8e9c2
(25 de febrero de 2019) por
Johannes Schindelin (
dscho
)
.
(Fusionada por
Junio C Hamano -
gitster
-
en
commit e36adf7
, 22 abr 2019)
Todavía puede
usar el script de shell con
git legacy-stash
.
Y:
stash
: conviertestash--helper.c
enstash.c
El antiguo script de shell
git-stash.sh
fue eliminado y reemplazado completamente porbuiltin/stash.c
.
Para hacer eso,create
ypush
se adaptaron para trabajar sinstash.sh
.Por ejemplo, antes de esta confirmación,
git stash create
llamagit stash--helper create --message "$*"
. Si se llamagit stash--helper create "$@"
, entonces algunos de estos cambios no habrían sido necesarios.Esta confirmación también elimina la palabra
helper
ya que ahora se llama directamente a stash y no mediante un script de shell.
Hay optimizaciones:
stash
: optimizaget_untracked_files()
ycheck_changes()
Este commit introduce una optimización al evitar llamar nuevamente a las mismas funciones.
Por ejemplo,git stash push -u
llamaría en algunos puntos las siguientes funciones:
check_changes()
(dentro dedo_push_stash()
)do_create_stash()
, que llama a:check_changes()
yget_untracked_files()
Tenga en cuenta que
check_changes()
también llama aget_untracked_files()
.
Entonces,check_changes()
se llama 2 veces yget_untracked_files()
3 veces.La antigua función
check_changes()
ahora consta de dos funciones:get_untracked_files()
ycheck_changes_tracked_files()
.Estas son las cadenas de llamadas para
push
ycreate
:
push_stash()
->do_push_stash()
->do_create_stash()
create_stash()
->do_create_stash()
Para evitar llamar a las mismas funciones una y otra vez,
check_changes()
dentro dedo_create_stash()
ahora se coloca en las funciones del llamador (create_stash()
ydo_push_stash()
).
De esta forma, loscheck_changes()
yget_untracked files()
seget_untracked files()
solo una vez.
git-stash
es un script, no un comando compilado en el binario
git.exe
.
En Linux: puedo encontrar
git-stash
en
/usr/lib/git-core/git-stash
: te dejaré buscar la ruta correcta en Windows ...
Este script usa
#!/bin/sh
para ejecutarse, no sé qué implementación de shell se usa cuando ejecuta esto en Windows.
Puede intentar ejecutarlo con otro shell compatible (aquí: bash):
# 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
También puede activar el indicador
-x
, que imprimirá un rastro de todos los comandos ejecutados, y verificará visualmente si uno de los subcomandos parece ser el soporte:
$ PATH=/usr/lib/git-core:$PATH bash -x /usr/lib/git-core/git-stash