¿Cómo hacer que diff funcione como git-diff?

148

Me gusta el formato de salida de git diff. El color y la +/ -representación de los cambios entre líneas es más fácil de leer que GNU diff.

Puedo ejecutar git diffusando --no-indexflag fuera de un repositorio de git y funciona bien. Sin embargo, parece faltarle la --excludeopción de excluir archivos o subdirectorios de un recursivo diff.

¿Hay alguna manera de obtener lo mejor de ambos mundos? (opciones de color y +/ -formato git diffy --excludeopción de GNU diff).

He experimentado con colordiff, pero todavía prefiero el formato de salida degit diff

Mzzzzzz
fuente
1
Para hacer el azul para las adiciones verdes, el cambio newtexten /etc/colordiff. Creo que git usa verde?
Rudie
1
Nunca había oído hablar de la bandera --no-index hasta ahora. Lo acabo de usar para comparar la salida de git show con la diferencia de dos archivos, ¡gracias por eso!
AJM-Reinstate-Monica

Respuestas:

175

No sé cómo hacer color, pero esto hará +/-más que <y >.

diff -u file1 file2
jonescb
fuente
66
Genial, esto combinado con el colordiff me acerca lo suficiente a lo que quiero. Supongo que tengo que desplazarme más abajo en la página del manual la próxima vez ... ¡Gracias!
Mzzzzzz 01 de
13
Una forma sencilla de obtener la coloración con diff -u, es también para canalizar la salida a TIG, la línea de comandos git repo espectador: diff -u file1 file2 | tig.
Samuel Lampa
3
Instale colordiffdesde su repositorio apt / yum / pacman y úselo.
iBug
Necesario para habilitar paquetes adicionales para Enterprise Linux (EPEL) en Amazon Linux para instalar colordiff: docs.aws.amazon.com/AWSEC2/latest/UserGuide/…
Pat Myron
1
Además colordiff, también puedes obtener color vimdefiniendo cdiff() { diff -u $@ | vim -R -; }.
Syrtis Major
94

También puede usar git diff --no-index -- A B(a través de la página de manual ).

eacousineau
fuente
1
+1, pero lamentablemente esto no funciona si uno de los archivos es un enlace simbólico.
Emil Lundberg
2
+1 Esto es muy útil ya que muestra cómo hacer un informe de git donde dos archivos rastreados Ay Bdifieren en comparación entre sí en lugar de donde cada archivo ha sido modificado en relación con su última revisión respectiva.
J. Katzwinkel
@EmilLundberg: funciona para mí con enlaces simbólicos en git 1.9.1 en Linux. No sé si las versiones anteriores están rotas.
kkm 01 de
3
git diff --no-indexes genial, pero como señaló el OP, carece de la --excludebandera, por lo que a menudo es de utilidad muy limitada.
Ken Williams
25
  1. Instalar colordiff .

  2. Actualice su ~ / .colordiffrc (copiando / etc / colordiffrc primero, si es necesario):

    # be more git-like:
    plain=off
    newtext=darkgreen
    oldtext=darkred
    diffstuff=darkcyan
    
  3. Úselo colordiff -u file1 file2para dos archivos o colordiff -ruN path1 path2para comparar rutas recursivamente.

No es exactamente lo mismo, pero está muy cerca.

Steve
fuente
18

Esto es lo que sugiero y está bastante cerca

diff -u FILE1 FILE2 | colordiff | less -R
  • colordiff: Tendrás que instalar esto
  • -R: esto le dice a Less que muestre colores en lugar de los códigos sin formato.

En última instancia, lo usé -wporque no quería ver los espacios en blanco.

diff -w -u FILE1 FILE2 | colordiff | less -R

Editar: según lo sugerido por @Ciprian Tomoiaga en el comentario, puede hacer que esto sea una función y ponerlo en su ~/.bashrcarchivo también.

function gdiff () { diff -u $@ | colordiff | less -R; }
Nate
fuente
44
Para tener una única función bash para esto, agregue al .bashrc:function gdiff () { diff -u $@ | colordiff | less -R; }
Ciprian Tomoiagă
4

GNU difftiene una --coloropción desde la versión 3.4 a finales de 2016 de acuerdo con esta respuesta en Unix SE. Ese lado -udebería ser suficiente para imitar la salida de git diff:

diff -u --color=always file1 file2 | less -r

--colordebe ser alwayscuando se usa en una tubería, autose apagará el color en las tuberías.

Solo he intentado esto con Git Bash en Windows, donde less -Rsolo colorearía la primera línea de un trozo. less -rme lo arregló en ese caso.

codehearts
fuente
3

Usando sólo bash, diff, tput, y less, podemos aproximar estrechamente la salida git diff. Sin embargo, habrá algunas diferencias notables, debido a la miopía de los diffprogramadores.

Ponga la siguiente definición de función Bash en algún archivo que su cuenta de usuario obtiene automáticamente, y podrá acceder a la función desde la línea de comandos:

function gdiff()
{
    local REG=`tput op`
    local GRP=`tput setaf 6`
    local ADD=`tput setaf 2`
    local REM=`tput setaf 1`

    local NL=$'\n'
    local GRP_LABEL="${GRP}@@ %df,%dn +%dF,%dN @@${REG}"

    local UNCH_GRP_FMT=''

    [[ "${1}" == '@full' ]] && {

        UNCH_GRP_FMT="${GRP_LABEL}${NL}%="
        shift
    }

    diff \
        --new-line-format="${ADD}+%L${REG}" \
        --old-line-format="${REM}-%L${REG}" \
        --unchanged-line-format=" %L${REG}" \
        --new-group-format="${GRP_LABEL}${NL}%>" \
        --old-group-format="${GRP_LABEL}${NL}%<" \
        --changed-group-format="${GRP_LABEL}${NL}%<%>" \
        --unchanged-group-format="${UNCH_GRP_FMT}" \
            "${@}" | less -FXR
}

Esta función funciona de la siguiente manera:

  1. En última instancia, diffse invoca con varias opciones de formato para especificar cómo se mostrarán los cambios dentro de los archivos.
  2. tputse utiliza para insertar códigos de color ANSI en esas opciones de formato. Tenga en cuenta que cuando utilice terminales que no sean ANSI, es posible que deba reemplazarlo tput setafpor tput setf.
  3. La salida de diffse canaliza a less. -Rpermite preservar los colores ANSI. -Xevita que se lessdespeje la pantalla al salir. -Fevita que lessfuncione como un buscapersonas si la salida cabe dentro de una pantalla.
  4. Si el primer parámetro es @full, la función mostrará todas las líneas sin cambios además de las líneas agregadas y eliminadas.

Tenga en cuenta las siguientes diferencias entre este enfoque y git diff:

  1. git diffinforma tres líneas de contexto que rodean cada cambio. Desafortunadamente, diffparece quejarse y salir si desea especificar el número de líneas de contexto y al mismo tiempo especificar las opciones de formato. (Al menos lo hace en Mac OS X Yosemite). Gracias diffprogramadores. Por lo tanto, puede solicitar que no haya líneas de contexto que rodeen cada cambio, que es el comportamiento predeterminado, o puede solicitar que también se informen todas las líneas sin cambios dentro del archivo, especificando @fullcomo el primer parámetro.
  2. Debido a que las líneas de contexto son diferentes de git diff, los números de línea reportados por esta función también pueden variar de los reportados por git diff.
  3. Puede ver la presencia de cambios de una sola línea informados, que es el comportamiento correcto, pero molesto cuando el archivo modificado contiene la inserción de líneas vacías individuales. Creo que git difftrata esto mejor, a través de sus líneas de contexto. diffSi lo prefiere, puede intentar pasar diferentes opciones para tratar mejor el espacio en blanco.
Dejay Clayton
fuente
2

Usted está buscando colordiff:

sudo apt-get install colordiff
Davoud Taghawi-Nejad
fuente
2

Coloque esto en su .bashrco .zshrc:

diff() { git diff --no-index "$1" "$2" | colordiff; }

requisitos: gity colordiffdeben instalarse de antemano.

uso: diff file1 file2

ejemplo: por $diff .tmux.conf .zshrc.pre-oh-my-zsh

ejemplo de función diff

himanshuxd
fuente
0

La otra opción es hacerlo desde fuera del repositorio para que git sepa diferir entre archivos. p.ej. una función de shell algo así como:

gdiff() {
    (
        dir=`pwd`
        cd ./$(git rev-parse --show-cdup)/..
        git diff  $dir/$1 $dir/$2
    )
}
Karl
fuente
0

Usar colordiff :

Instalación:

sudo apt-get install colordiff

Uso:

colordiff -u file_one file_two

Da exactamente la misma diferencia que se muestra en git diff.

Rakmo
fuente
0

Si no tiene colordiffo git diff, puede obtener color vim.

cdiff() { diff -u $@ | vim -R -; }

o simplemente

cdiff() { diff -u $@ | view -; }
Syrtis Major
fuente
0

Dado que el murciélago tiene una buena coloración, he probado si eso también funciona diffy sorprendentemente funcionó muy bien desde el primer momento.

$ diff file1 file2 | bat o $ diff -u file1 file2 | bat

Así que supongo que podría hacer una función como esta a continuación para ser más eficiente:

function bdiff () { diff -u $@ | bat;}
Heechul Ryu
fuente
0

Probado en Debian 9 diff -u --color=always file1 file2

NoOneYouKnow
fuente
-2

Creo que la configuración de configuración:

[color]
     ui = true

combinado con la --relative=<path>opción del comando "diff" haría lo que quisiera. Has probado ?

Ninguno-da
fuente
3
Esto es para la diferencia en git. Estaba preguntando por las diffopciones del programa
tr33hous