¿Por qué no debería usar este command Git de porcelana para decir si mi repository tiene algún cambio?

He pirateado un actualizador para mi aplicación, para que las personas con poca o ninguna habilidad de encoding puedan instalar, ejecutar y actualizar la aplicación en sus propias máquinas.

Aquí hay un ejemplo de un actualizador, escrito para el símbolo del sistema de Windows:

@echo off for /f %%i in ('call git status --porcelain') do set stash=%%i if not [%stash%] == [] ( echo Stashing local changes... call git add . call git stash -q ) echo Updating App... call git pull origin master if not [%stash%] == [] ( echo Restoring local changes... call git stash apply -q ) echo Updating Dependencies... call npm update echo Done pause 

Como puede ver, estoy llamando al git status --porcelain para saber si una aplicación tiene cambios locales que deben ocultarse antes de extraer la twig maestra remota.

Este command no devolverá nada si el directory de trabajo está limpio, pero siempre devolverá algo si hay cambios locales, rastreados o no.

He leído en otras publicaciones de SO que es malo usar commands de porcelana para hacer trabajos de plomería en git, pero en este caso, me está funcionando bien, y no veo por qué el git status --porcelain command de git status --porcelain alguna vez devolver algo cuando hay un directory de trabajo limpio.

Entonces mis preguntas son: ¿está mal usar porcelana para este caso de uso específico? Y si es así, ¿por qué?

Bono: ¿Cuál sería una mejor manera de hacerlo?

En realidad, no hay nada de malo en usar el git status con el interruptor de --porcelain . Además, cuando atisbes los documentos, verás que usaste el command exactamente de la manera en que fue diseñado:

Proporcione el resultado en un formatting fácil de analizar para los scripts. Esto es similar a la salida corta, pero se mantendrá estable en todas las versiones de Git e independientemente de la configuration del usuario. Ver abajo para más detalles.

Otra opción es usar -s switch ( git status -s ) que también devolverá resultados fáciles de analizar, pero no se puede garantizar que funcione de la misma manera para futuras versiones.

No encuentro este uso particular del git status de git status incorrecto de ninguna manera. Hace el trabajo, lo hace de manera confiable y de manera fácil de entender.

Un command equivalente con porcelana puede ser, por ejemplo:

 git ls-files --exclude-per-directory=.gitignore --exclude-from=.git/info/exclude --others --modified -t 

Pero desde git ls-files documentos en -t cambiar:

Esta function está semi-desaprobada. Para propósitos de scripting, git-status (1) – porcelain y git-diff-files (1) – name-status son casi siempre alternativas superiores, y los usuarios deben mirar git-status (1) – short o git- diff (1) – estado del nombre para alternativas más fáciles de usar.

Entonces ves que incluso el manual de git aconseja usar la alternativa de git status .

git status --porcelain no es un command de porcelana. El nombre de la opción es engañoso, pero en realidad significa "dar una salida fácil de analizar y estable, adecuada para su uso en scripts de porcelana". Entonces, " --porcelain " significa "actuar como un command de fontanería".

Como ya se dijo en la otra respuesta, no hay nada de malo en lo que haces, --porcelain está destinado a ser utilizado de la manera en que lo haces.

    Intereting Posts