2011-01-31 30 views
90

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.¿Cómo hacer que diff funcione como git-diff?

Puedo ejecutar git diff usando la bandera --no-index fuera de un git repo y funciona bien. Sin embargo, parece que falta la opción --exclude para excluir archivos o subdirectorios de un recursivo diff.

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

He experimentado con colordiff, pero yo prefiero el formato de salida de git diff

+1

Para hacer que el azul para las adiciones verde, el cambio 'newtext' en'/etc/colordiff'. Creo que git usa verde? – Rudie

Respuesta

106

No sé cómo hacer el color, pero esto hará el +/- en lugar de < y >.

diff -u file1 file2 
+5

Genial, esto combinado con colordiff me acerca lo suficiente a lo que quiero. Supongo que necesito avanzar más abajo en la página del manual la próxima vez ... ¡Gracias! – Mzzzzzz

+4

Una forma simple de obtener colorización con diff -u, es también conectar la salida a tig, la línea de comando git repo viewer: 'diff -u file1 file2 | tig'. –

-1

creo que el ajuste de configuración:

[color] 
    ui = true 

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

+2

Esto es para el diff en 'git'. Estaba pidiendo las opciones del programa 'diff' – tr33hous

0

La otra opción es hacerlo desde fuera del repositorio, por lo que git sabe diferenciar entre archivos. p.ej. una función de shell algo como:

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

Usted está buscando colordiff:

sudo apt-get install colordiff 
70

También puede utilizar git diff --no-index -- A B (a través de manpage).

+1

+1, pero lamentablemente esto no funciona si uno de los archivos es un enlace simbólico. –

+2

+1 Esto es muy útil ya que muestra cómo hacer que git informe dónde dos archivos rastreados 'A' y' B' difieren en comparación con * entre sí * en lugar de donde cada archivo se ha modificado en relación con su última revisión respectiva. –

+0

@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

20
  1. Instalar colordiff.

  2. actualización de su ~/.colordiffrc (copiar/etc/colordiffrc primero, si es necesario):

    # be more git-like: 
    plain=off 
    newtext=darkgreen 
    oldtext=darkred 
    diffstuff=darkcyan 
    
  3. Uso colordiff -u file1 file2 de dos archivos o colordiff -ruN path1 path2 para las rutas de forma recursiva que comparan.

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

13

Esto es lo que sugieren y es bastante estrecha

diff -u FILE1 FILE2 | colordiff | less -R 
  • colordiff: Vas a tener que instalar este
  • -R: esto le dice Menos de mostrar colores en lugar de los códigos primas.

Finalmente utilicé -w porque no quería ver espacios en blanco diffs.

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

Editar: Según lo sugerido por @Ciprian Tomoiaga en el comentario, se puede hacer esta función y lo puso en su archivo ~/.bashrc también.

function gdiff() { diff -u [email protected] | colordiff | less -R; } 
+4

Tener una única función bash para este complemento a .bashrc: 'función gdiff() {diff -u $ @ | colordiff | menos -R; } ' –

2

única bash, diff Uso, tput y less, podemos aproximar estrechamente la salida de git diff. Sin embargo, habrá algunas diferencias notables debido a la falta de visión de los programadores diff.

ponga la siguiente definición de función Bash en algún archivo de origen que consigue automáticamente por su cuenta de usuario, y usted será capaz de 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, diff se invoca con varias opciones de formato para especificar cómo se mostrarán los cambios dentro de los archivos.
  2. tput se 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 reemplazar tput setaf con tput setf.
  3. La salida de diff se canaliza a less. -R permite preservar los colores ANSI. -X impide que less borre la pantalla al salir. -F impide que less funcione como buscapersonas si la salida se ajusta 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.

Nota las siguientes diferencias entre este enfoque y git diff:

  1. git diff reporta tres líneas de contexto que rodea a cada cambio. Desafortunadamente, diff parece quejarse y salir si desea especificar el número de líneas de contexto al mismo tiempo que especifica las opciones de formateo. (Al menos lo hace en Mac OS X Yosemite). Gracias diff programadores. Por lo tanto, puede solicitar ninguna línea de contexto que rodee cada cambio, que es el comportamiento predeterminado, o puede solicitar que todas las líneas sin modificar dentro del archivo también sean reportadas, especificando @full como el primer parámetro.
  2. Dado que las líneas de contexto son diferentes de git diff, los números de línea informados por esta función también variarán de los informados por git diff.
  3. Es posible que vea la presencia de cambios de línea única, que es el comportamiento correcto, pero molesto cuando el archivo modificado contiene la inserción de líneas vacías. Creo que git diff trata esto mejor, a través de sus líneas de contexto. Podría intentar pasar diferentes opciones al diff para tratar mejor el espacio en blanco, si lo prefiere.
1

colocar esto en tu .bashrc o .zshrc:

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

REQUISITOS: git y colordiff debe ser instalado de antemano.

uso: diff file1 file2

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

diff function example

Cuestiones relacionadas