ú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:
- 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 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
.
- 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.
- 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
:
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.
- 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
.
- 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.
Para hacer que el azul para las adiciones verde, el cambio 'newtext' en'/etc/colordiff'. Creo que git usa verde? – Rudie