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 diff
programadores.
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:
- 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 reemplazarlo tput setaf
por tput setf
.
- La salida de
diff
se canaliza a less
. -R
permite preservar los colores ANSI. -X
evita que se less
despeje la pantalla al salir. -F
evita que less
funcione como un buscapersonas si la salida cabe 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 las opciones de formato. (Al menos lo hace en Mac OS X Yosemite). Gracias diff
programadores. 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 @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 reportados por esta función también pueden variar de los reportados por git diff
.
- 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 diff
trata esto mejor, a través de sus líneas de contexto. diff
Si lo prefiere, puede intentar pasar diferentes opciones para tratar mejor el espacio en blanco.
newtext
en/etc/colordiff
. Creo que git usa verde?