git-diff: no tener en cuenta el orden de las líneas

3 minutos de lectura

Tengo un archivo en mi repositorio que es generado por un programa de software.

Este programa a veces reordena las líneas en ese archivo, lo cual no es realmente importante porque el orden de las líneas no importa. El problema es que cuando se ejecuta git-diff es muy difícil ver si algo ha cambiado o no.

¿Hay alguna forma de realizar una diferencia en la que no se tenga en cuenta el orden de las líneas? O, si no es posible con git-diff, ¿algún comando de shell que se le ocurra?

¡Gracias!

  • Si el orden de las líneas realmente no importa, supongo que podría sort el archivo de alguna manera antes de enviarlo a git

    – twalberg

    4 de diciembre de 2013 a las 15:05

  • No importa, pero está más o menos ordenado para que sea legible por humanos. Por lo tanto, no quiero ordenarlo antes de la confirmación, pero tal vez solo ordenarlo antes de la diferencia. No sé si me explico.

    – Diego Herránz

    4 de diciembre de 2013 a las 15:17

  • Arregle el generador para que siempre produzca el archivo en un orden canónico fijo.

    – twalberg

    18 de junio de 2014 a las 20:53

avatar de usuario
diego herranz

Al final del día, estoy ejecutando manualmente este comando antes de comprometerme a saber si el archivo realmente cambió o es solo un reordenamiento de línea. Tal vez configuraré un git hook para ello.

diff -wB <(sort file.txt) <(git show HEAD:file.txt | sort -)

Este comando compara el archivo en el directorio de trabajo con el archivo en la última confirmación de su rama sin tener en cuenta el orden de las líneas.

En mi caso, uso -w y -B, para ignorar los espacios en blanco y las líneas que también agrega el programa. De man diff:

   -w, --ignore-all-space
          ignore all white space
   -B, --ignore-blank-lines
          ignore changes whose lines are all blank

avatar de usuario
anarquista

aquí hay un truco bastante desagradable usando DIFF_EXTERNAL_TOOL:

#!/bin/bash

# this will be called with path old-file old-hex old-mode new-file new-hex new-mode
echo $*
diff -uw <(tr -s '[[:space:]]' < "$2" | sort -fbi) <(tr -s '[[:space:]]' < "$5" | sort -fbi) || true

esto se puede llamar con, suponiendo que arroje el script anterior en el wdiff-sort programa en tu $PATH:

GIT_EXTERNAL_DIFF=wdiff-sort git diff

Aquí, por ejemplo, cómo usé esto para comparar un montón de cambios para vincular archivos de zona:

#!/bin/bash

#                path old-file old-hex old-mode new-file new-hex new-mode
#echo $*
atomize_zone="sed 's/^@//;/^\;/d;s/[[:space:]][[:space:]]*/ /g' | egrep -v '^.TTL (1D|86400)' | grep -v '; serial' | grep -v 'RR TTL' | grep -v '^.TTL 1H' | egrep -v 'IN SOA (ns1|bureau).koumbit.net' | sort -fbi" 

output=$(diff -uw <(sh -c "$atomize_zone" <"$2") <(sh -c "$atomize_zone" < "$5") || true)

if [ ! -z "$output" ]; then
        echo $1
        cat <<EOF
$output
EOF

Esto debe parecer una locura, pero en realidad funciona muy bien y permite limpiar los archivos de varias maneras antes de diferenciarlos.

  • qué wdiff-sort ?

    – Agente_L

    29 de marzo a las 14:38

  • es un script personalizado hecho de las primeras líneas de mi comentario.

    – anarcato

    30 de marzo a las 15:13

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad