files - git pull
¿Cómo hacer que diff funcione como git-diff? (9)
Instala colordiff .
Actualice su ~ / .colordiffrc (copiando / etc / colordiffrc primero, si es necesario):
# be more git-like: plain=off newtext=darkgreen oldtext=darkred diffstuff=darkcyan
Utilice
colordiff -u file1 file2
para dos archivos ocolordiff -ruN path1 path2
para comparar recursivamente las rutas.
No es exactamente lo mismo, pero está muy cerca.
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 diff
usando --no-index
indicador de --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 una diff
recursiva.
¿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 todavía prefiero el formato de salida de git diff
Al usar solo bash
, diff
, tput
y less
, podemos aproximarnos mucho a la salida de git diff
. Sin embargo, habrá algunas diferencias notables debido a la miopía de los programadores de diff
.
Coloque la siguiente definición de función Bash en algún archivo que obtenga su fuente automáticamente, y podrá acceder a la función desde la línea de comando:
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:
- En última instancia,
diff
se invoca con varias opciones de formato para especificar cómo se mostrarán los cambios dentro de los archivos. -
tput
se usa para insertar códigos de color ANSI en esas opciones de formato. Tenga en cuenta que al usar terminales que no sean ANSI, puede que tenga que reemplazartput setaf
contput setf
. - La salida de
diff
se canaliza enless
.-R
permite preservar los colores ANSI.-X
evita que-X
less
la pantalla al salir.-F
evita que funcioneless
como un buscapersonas si la salida se ajusta dentro de una pantalla. - 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
:
-
git diff
informa tres líneas de contexto que rodean cada cambio. Desafortunadamente,diff
parece quejarse y salir si desea especificar el número de líneas de contexto y al mismo tiempo especificar opciones de formateo. (Al menos lo hace en Mac OS X Yosemite). Graciasdiff
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. - Debido a 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 porgit diff
. - Puede ver 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
lidia con esto mejor, a través de sus líneas de contexto. Podría intentar pasar diferentes opciones adiff
para tratar mejor el espacio en blanco, si lo prefiere.
Creo que la configuración de configuración:
[color]
ui = true
combinada con la --relative=<path>
del comando "diff" --relative=<path>
haría lo que usted quisiera. Has probado ?
Esto es lo que sugiero y está bastante cerca
diff -u FILE1 FILE2 | colordiff | less -R
-
colordiff
: Tendrás que instalar esto-
brew install colordiff
en mi Mac. -
port install colordiff
en algunos Mac. -
sudo apt-get install colordiff
en Debian o Ubuntu - Para otras plataformas, descargue la fuente de colordiff o GitHub y siga las instrucciones de instalación
-
-
-R
: esto le dice a Less que muestre los colores en lugar de los códigos brutos.
Finalmente utilicé -w
porque no quería ver diferencias en el espacio en blanco.
diff -w -u FILE1 FILE2 | colordiff | less -R
Editar: como sugirió @Ciprian Tomoiaga en el comentario, puede hacer que esto sea una función y ponerlo también en su archivo ~/.bashrc
.
function gdiff () { diff -u $@ | colordiff | less -R; }
La otra opción es hacerlo desde fuera del repositorio, así que git sabe diferenciar 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
)
}
No sé cómo hacer el color, pero esto hará el +/-
lugar de <
y >
.
diff -u file1 file2
También puede usar git diff --no-index -- AB
(a través de la página de manpage ).
Usted está buscando colordiff
:
sudo apt-get install colordiff