Git config alias escaping

Intento escribir un git alias que elimine de los posts de confirmación la cadena "[ci skip]" (colocada al final del post), pero estoy teniendo problemas para escaping. El alias toma todo el compromiso del pasado como argumento para HEAD .

Si ejecuto el siguiente command:

 git filter-branch -f --msg-filter "sed -e \"s/\[ci skip\]$//g\"" master..HEAD 

funciona como se esperaba De todos modos si creo el siguiente alias:

 unwip = !sh -c 'git filter-branch -f --msg-filter \"sed -e \\\"s/\[ci skip\]$//g\\\"\" $0..HEAD' 

y ejecuto git unwip master se queja de configuration incorrecta, pero espero que se comporte como los commands anteriores. ¿Cómo puedo arreglar esto?

EDITAR Esta solución no funciona en todos los casos. Aquí hay una solución correcta que funciona en todos los casos.

Estoy usando bash como una command-line y el siguiente alias funcionó para mí:

 unwip = "!f() { git filter-branch --msg-filter 'sed -e "s/[ci skip/]$/g"' $1..HEAD ; }; f" 

El único inconveniente es que estás especificando el intérprete y siempre usando sh . En mi caso, estoy confiando en el shell del usuario. Aunque no creo que sea un problema en ninguno de los principales proyectiles ya que solo estamos haciendo cosas básicas.

Solución genérica

Obtener un alias git para pasar el analizador correctamente puede ser un set alucinante de \\\\" ruido, así que creé dos alias:

 # Quote / unquote a sh command, converting it to / from a git alias string quote-string = "!read -rl; printf \\\"!; printf %s \"$l\" | sed 's/\\([\\\"]\\)/\\\\\\1/g'; printf \" #\\\"\\n\" #" quote-string-undo = "!read -rl; printf %s \"$l\" | sed 's/\\\\\\([\\\"]\\)/\\1/g'; printf \"\\n\" #" 

Esto le permite convertir cualquier cosa que pueda escribir en sh + , por ejemplo:

 $ echo '\"' 

\"

En una cadena citada adecuada para un alias:

 $ git quote-string echo '\"' 

"!echo '\\\"' #"

Para citar una cadena de varias líneas, escribí una secuencia de commands más larga, que sugiero que ejecute como:

git quote-string | sponge

Respondiendo al problema específico de OP

Usando git quote-string en el command del OP, obtengo:

"!git filter-branch -f --msg-filter \"sed -e \\\"s/\\[ci skip\\]$//g\\\"\" master..HEAD #"

Por lo tanto, para usar el nombre de alias preferido del OP, debajo de [alias] en ~/.gitconfig , agregue:

 unwip = "!git filter-branch -f --msg-filter \"sed -e \\\"s/\\[ci skip\\]$//g\\\"\" master..HEAD #" 

Depuración

A veces es bueno ver lo que sucede debajo del capó. Prueba este alias:

 debug = "!set -x; GIT_TRACE=2 GIT_CURL_VERBOSE=2 GIT_TRACE_PERFORMANCE=2 GIT_TRACE_PACK_ACCESS=2 GIT_TRACE_PACKET=2 GIT_TRACE_PACKFILE=2 GIT_TRACE_SETUP=2 GIT_TRACE_SHALLOW=2 git" 

Simplemente inserte la debug entre git y lo que normalmente seguiría, por ejemplo, para la pregunta del OP:

git debug unwip


+ git usa /bin/sh para ejecutar alias comenzando con ! * . Para evitar esto, crea una línea de command como: bash -c 'echo \\\"' y luego pasa esto a git quote-string .

* Ver el encabezado "Depuración" para testing