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:
- En última instancia,
diffse invoca con varias opciones de formato para especificar cómo se mostrarán los cambios dentro de los archivos.
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.
- 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.
- 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 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.
- 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 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.
newtexten/etc/colordiff. Creo que git usa verde?