with untracked tutorial stash specific name files drop windows git git-bash git-stash

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 en true
  • core.preloadindex se establece en true
  • gc.auto se establece en 256
  • 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 : convierte stash--helper.c en stash.c

El antiguo script de shell git-stash.sh fue eliminado y reemplazado completamente por builtin/stash.c .
Para hacer eso, create y push se adaptaron para trabajar sin stash.sh .

Por ejemplo, antes de esta confirmación, git stash create llama git stash--helper create --message "$*" . Si se llama git 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 : optimiza get_untracked_files() y check_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 de do_push_stash() )
  • do_create_stash() , que llama a: check_changes() y get_untracked_files()

Tenga en cuenta que check_changes() también llama a get_untracked_files() .
Entonces, check_changes() se llama 2 veces y get_untracked_files() 3 veces.

La antigua función check_changes() ahora consta de dos funciones: get_untracked_files() y check_changes_tracked_files() .

Estas son las cadenas de llamadas para push y create :

  • 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 de do_create_stash() ahora se coloca en las funciones del llamador ( create_stash() y do_push_stash() ).
De esta forma, los check_changes() y get_untracked files() se get_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