¿Cómo puedo hacer que funcione este alias de git con comillas?
Quiero hacer un alias de git diff que solo muestre las líneas cambiadas (coloreadas).
[alias]
mdiff = diff --color | grep --color=never $'^\e\[3[12]m'
Esto no funciona, ya que aparentemente las tuberías no se pueden usar en alias de git, pero esta respuesta muestra una solución :
[alias]
mdiff = ! git diff --color | grep --color=never $'^\e\[3[12]m'
Sin embargo, esto tampoco funciona y sigo recibiendo este error: fatal: bad config line 17 in file /home/me/.config/git/config
Un comentario debajo de esa respuesta sugiere que el problema se debe a las citas.
Respuestas
Un alias de git sin !lo ejecuta Git. Si el alias contiene un |carácter, es solo un |carácter. No hay caparazón involucrado, por lo |que no significa una tubería.
Un alias de git que comienza con !es ejecutado por un shell. Git ejecuta lo que sigue !en un shell (después de realizar un análisis de comillas) y pasa los argumentos al final. Su segundo intento no es válido porque Git analiza las barras invertidas, debe duplicarlas y duplicar la barra invertida delante de, [ya que el shell debe ver \\[para que grep vea \[:
mdiff = ! git diff --color | grep --color=never $'\\e\\\\[3[12]m'
Pero esto no es correcto porque git mdiff fooes equivalente a ejecutar el comando de shell
git diff --color | grep --color=never $'\\e\\\\[3[12]m' foo
Necesita hacer arreglos para pasar los argumentos a git. Puede hacerlo definiendo una función y luego ejecutándola. Debe tener cuidado porque ;necesita cotización. Esto funciona en el lado de Git:
mdiff = ! "f () { git diff --color \"$@\" | grep --color=never $'\\e\\\\[3[12]m'; }; f"
Sin /bin/shembargo, esto solo funciona si es bash, no si es dash. Dash no admite la $'…'sintaxis de escape. Si /bin/shes un guión, debe producir el carácter de escape con printf.
mdiff = ! "f () { git diff --color \"$@\" | grep --color=never $(printf '\\033\\\\[3[12]'); }; f"
Si todo lo que quiere hacer es quitar el contexto (pero mantener los nombres de archivo y los indicadores de la posición), que está construido en: git diff -U0.