mercurial - nike - ¿Por qué "hg status" muestra los archivos cambiados cuando "hg diff-g" no?(Un padre)
mercurial svn (5)
Acabo de eliminar los archivos que aparecieron como modificados (hacer una copia de seguridad si es necesario) lo que causó que todos los archivos se mostraran con un! al lado cuando corri
hg st
Después de eso, ejecuté el siguiente comando para revertir los archivos (que ya estaban registrados):
hg revert --all --no-backup
y eso soluciono el problema
Tengo un repositorio donde:
> hg st
muestra que mi directorio de trabajo tiene algunos cambios no confirmados,
> hg diff
> hg diff -g
> hg diff --git
no mostrar nada
Leo aquí: 4.10. El estado de hg muestra los archivos modificados, pero hg diff no lo hace. el seguimiento:
El estado de hg informa cuando el contenido del archivo o las marcas han cambiado en relación con cualquiera de los padres. hg diff solo informa cambios en el contenido relativo al primer elemento primario. Puede ver la información de la bandera con la opción --git para hg diff y deltas en relación con el otro padre con -r.
Sin embargo, si ejecuto hg parents
muestra solo un padre (la sugerencia). Como mencioné anteriormente, también probé hg diff --git
y aún no muestra nada.
Nota:
- Lo anterior está en la versión 2.0.1 de Mercurial.
-
hg status
solo muestraM
junto a un archivo normal. -
hg diff
yhg diff -g
no imprimen nada - El sistema de archivos es NFS.
-
hg parents
imprime solo un padre
Algunos extractos de Mercurial en uso diario (Mercurial: la guía definitiva) (copiando aquí porque parece que no hay manera de proporcionar un enlace conveniente al final de la página):
La salida predeterminada del comando
hg diff
es compatible hacia atrás con el comandodiff
estándar, pero esto tiene algunos inconvenientes.La salida de hg diff anterior oculta el hecho de que simplemente cambiamos el nombre de un archivo . El comando hg diff acepta una opción,
--git
o-g
, para usar un formato diff más nuevo que muestre dicha información en una forma más legible.Esta opción también ayuda con un caso que de otra manera podría ser confuso: un archivo que parece ser modificado según el
hg status
, pero para el cualhg diff
no imprime nada. Esta situación puede surgir si cambiamos los permisos de ejecución del archivo .El comando diff estándar no presta atención a los permisos de archivos, por lo que
hg diff
no imprime nada de forma predeterminada. Si lo suministramos con la opción-g
, nos dice lo que realmente sucedió.
Para resumir, el comando hg diff
omite varios tipos de información sobre cambios: atributos, permisos, nombres de archivos, etc. Estos cambios pueden existir incluso si tiene un único padre. Y el hg status
correctamente tiene en cuenta todos los cambios. Para ver lo que ha sucedido, use hg diff -g
. Es la respuesta a la pregunta ''qué pasa''.
Parece que la compatibilidad hacia atrás es el ''por qué''. No estoy seguro, pero supongo que la ''diferencia normal'' es una herramienta Unix / Linux extendida o incorporada (a juzgar por el hecho de que tanto hg como git provienen de ese mundo).
En estas situaciones (le pasa mucho a mi equipo), encuentro que este comando solucionará cualquier cosa:
hg debugrebuilddirstate
o
hg debugrebuilddirstate -r tip
Está ligeramente documentado en la documentación de ayuda , pero básicamente creo que borra el archivo "dirstate" que almacena información sobre los archivos del directorio de trabajo. La próxima vez que hg stat
se actualizará desde cero.
Una advertencia: si ha agregado o eliminado archivos, esa información se perderá cuando se reconstruya el dirstate
.
En mi caso algo se rompió con hg. (los mismos permisos y hg diff -g no muestra nada). Solucioné el problema con la siguiente manera:
- Volví a clonar el repositorio en una carpeta separada
- Eliminé todo de esta carpeta, excepto .hg
- Me mudé de un lugar antiguo (roto) todo, excepto .hg a un lugar nuevo
Así que después de este paso tengo un repositorio que clonado con la versión actual de mercurial + exactamente los mismos archivos.
Después de estos pasos, recibí los mismos resultados (vacíos) para los comandos: hg st
y hg diff -g
Si tiene ignorews
o ignoreblanklines
establecidos en .hgrc
entonces hg status
lo mostrará como cambiado, pero hg diff
no lo hará (asumiendo que los cambios son solo espacios en blanco).