2011-05-19 17 views
14

Algunas opciones en git diff, por ejemplo --name-status, provocan el resultado de una letra de estado junto a un nombre de archivo. Ellos son:¿Qué significan los estados "emparejamiento roto" y "desconocido" de Git y cuándo ocurren?

A, C, D, M, R, T, U, X, B

... y que significan

Agregado (A), copiar (C), Borrado (D), Modificado (M), Renombrado (R), tipo (es decir, archivo regular, enlace simbólico, submódulo, ...) cambiado (T), Sin fusionar (U), Desconocido (X) o apareamiento Roto (SEGUNDO).

Pregunta: cómo deben interpretarse las X y B estados, y que las circunstancias conducen a su apariencia? ¿Puede proporcionar una serie de pasos que conducen a tales estados que aparecen en el resultado de git-diff, y posiblemente formas de solucionarlos?

Respuesta

12

El “par roto” status B nunca aparece directamente en --name-status de salida, que sólo es útil como un argumento a la opción --diff-filter cuando también mediante la opción -B (--break-rewrites). Al usarlo como filtro, se seleccionan los archivos que tienen al menos un cierto porcentaje de su contenido eliminado o modificado.

Este "rompimiento" no es terriblemente útil con --name-status ya que el punto de "ruptura" es principalmente cambiar cómo se genera el texto diff: elimina las líneas de contexto de la salida diff en lugar de generar el complemento y elimine las líneas que serían necesarias alrededor de las subsecuencias comunes "aleatorias" que encuentre el algoritmo diff.

git init broken-pairs 
cd broken-pairs 
nums() { seq "$1" "$2" 2>/dev/null || jot $(($2 - $1 + 1)) "$1"; } 
nums 0 99 > a 
nums 100 199 > b 
git add a b 
git commit -ma=0-99,b=100-199 
nums 200 299 > a 
{ nums 100 149; nums 350 399; } > b 
git diff --name-status --diff-filter=B    # selects nothing 
git diff --name-status --diff-filter=B -B   #   M100 a 
git diff --name-status --diff-filter=B -B/50  #   M100 a M050 b 

El estado X “desconocido” nunca debe aparecer en realidad. Si aparece, significa que una ruta de acceso que no está sin fusionar, agregada, eliminada, modificada o su tipo ha cambiado (efectivamente: sin cambios) inesperadamente llegó al núcleo de la maquinaria interna de diferenciación; el error feeding unmodified <pathname> to diffcore también se generará.

Parece haber quedado de un antiguo modo de funcionamiento.

+0

Gracias por la respuesta precisa y exhaustiva! –

+0

El estado 'U' se puede usar para detectar archivos en conflicto durante una operación' git rebase'. Por ejemplo, tengo un alias 'git conflict' que ejecuta' diff --name-only --diff-filter = U' para ayudar a identificar archivos con conflictos de fusión. – larsks

Cuestiones relacionadas