2009-03-01 25 views
10

¿Alguien sabe de un plomero Git (definitivamente no porcelana) medios para determinar si:git programático estado

  • hay cambios en el repositorio desde la última confirmación, y
  • si jefe local está por delante de origen/CABEZA

Estoy tratando de determinar esto programáticamente, de ahí el deseo de no resolver esto con porcelana y varios sed-fu.

Respuesta

9

Actualización: como mentioned below por toupeira, puede utilizar la opción de --porcelaingit status (ya comprometerse 6f15787, septiembre de 2009, Git 1.7.0).

he mencionado en mi respuesta "What does the term porcelain mean in Git?" que:

Tal vez el significado de --porcelain aquí es "producir una salida adecuada para el consumo por los scripts de porcelana"

Sin embargo, eso no lo hará muestra la información anterior/posterior: ver "What to add to “git status --porcelain” to make it behave like “git status”?": para eso, aún necesitaría usar otros comandos: ver "How to know if git repository has changes that have not been synchronized with server?"


respuesta inicial de marzo de 2009

Al mando de porcelana, una:

$ git diff HEAD 

le da los cambios desde la última confirmación (lo que estaría cometiendo si ejecuta "git commit -a") .

Una posible equivalente al mando de plomería sería:

$ git ls-files -m 

por la publicación de todos (directorio de trabajo o índice) modificado archivos


Si crea su repositorio por clonación repositorio de otra persona, el la rama remota "maestra" se copia a una rama local llamada "origen". Obtienes tu propia rama "maestra" que no está vinculada al repositorio remoto.

Siempre hay un encabezado actual, conocido como HEAD. (Esto es en realidad un enlace simbólico, .git/HEAD, a un archivo como refs/heads/master.)

plazo "git status" y analizar la salida:

# On branch master 
# Your branch is ahead of 'origin/master' by 11 commits. 
# 

Más detalles en el SO pregunta "Why is Git telling me “Your branch is ahead of ‘origin/master’ by 11 commits.” and how do I get it to stop?"

equivalente posible al mando de plomería:

* git-for-each-ref 

para enumerar todas las confirmaciones, pero requiere el análisis de la salida, así ...

Nuevamente, git ls-files could be used to produced the same result than a git status.

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

Eso es genial. Muchas gracias. –

+5

"git ls-files --exclude-standard ..." sería un poco más simple. –

2

git status ahora tiene un argumento --porcelain para los propósitos de secuencias de comandos (así como una alternativa -z para la máquina de análisis sintáctico), esto se prefiere git ls-files que no muestra archivos añadidos al índice.

+0

De [la documentación para '--porcelain'] (https://www.kernel.org/pub/software/scm/git/docs/git-status.html):" Entregue la salida de una manera fácil: formato de parse para scripts. Es similar al resultado corto, pero se mantendrá estable en todas las versiones de git e independientemente de la configuración del usuario ". –

+0

No está claro en las notas de la versión sobre cuándo se agregó la bandera '--porcelain'. –

+0

¡Lo encontré! Busqué en el registro de Git con 'git log --grep" --porcelain "--date-order', y muestran que la bandera se agregó en commit [' 6f15787181a163e158c6fee1d79085b97692ac2f'] (https://github.com/git/ git/commit/6f15787181a163e158c6fee1d79085b97692ac2f) el 5 de septiembre de 2009. Incidentalmente, 'git tag --contiene 6f15787 | ordenar -V | less' revela que esto no se publicó en realidad en una versión estable hasta la v1.7.0, que estaba en [12 de febrero de 2010] (https://github.com/git/git/commit/e923eaeb901ff056421b9007adcbbce271caa7b6). –

Cuestiones relacionadas