2012-02-15 9 views
6

Quiero publicar el proceso de la salida de git log y he estado jugando con la configuración --pretty. Cuando yo, por ejemplo, do¿Puedo escapar de los caracteres en la salida de registro de git?

--pretty=format:'{"sha":"%h","message":"%B","author":"%aN <%aE>","commit":"%cE","date":"%cD"} 

obtengo una salida similar a JSON; cuando puse un { o } o incluso un " en el mensaje de confirmación esto daña mi salida.

¿Hay alguna forma de decirle a git log que escape esos caracteres, p. ¿anteponiendo un \?

Hay dos preguntas similares Git log output to XML, JSON or YAML y Git log output preferably as XML, pero ambos no abordan el escape de los caracteres especiales (por ejemplo, si en el caso de XML puse <foo> en mi mensaje de confirmación, el XML resultante será roto).

+0

que puedes usar 'git rev-list' para scripting – knittl

Respuesta

4

Escapar de cuerdas no es trabajo de Git; git log no tiene nada que te ayude a hacer eso. Para lograr lo que busca, necesitará algo como sed para hacer la edición de cadenas por usted.

Prueba esto (debería funcionar en la mayoría de los depósitos, pero sólo he comprobado en Cygwin Bash):

function escape_chars { 
    sed -r 's/(\{\}")/\\\1/g' 
} 
function format { 
    sha=$(git log -n1 --pretty=format:%h $1 | escape_chars) 
    message=$(git log -n1 --pretty=format:%B $1 | escape_chars) 
    author=$(git log -n1 --pretty=format:'%aN <%aE>' $1 | escape_chars) 
    commit=$(git log -n1 --pretty=format:%cE $1 | escape_chars) 
    date=$(git log -n1 --pretty=format:%cD $1 | escape_chars) 
    echo "{\"sha\":\"$sha\",\"message\":\"$message\",\"author\":\"$author\",\"commit\":\"$commit\",\"date\":\"$date\"}" 
} 

for hash in $(git rev-list) 
do 
    format $hash 
done 

Lo anterior escapar { y } y no \, aunque desde JSON.org tanto \{ y son \} escapes no válidos; solo \ y " necesitan escaparse. (. Reemplazar la expresión sed con sed -r 's/("\\)/\\\1/g' para la verdadera salida de JSON)

También he dejado el valor "comprometerse", ya que es en su ejemplo, aunque el comando %cE en realidad le da la dirección de correo electrónico del commiter; No estoy seguro de si eso es lo que pretendías.

(Esto incluye ahora un correct but rejected edit por macrobug. Gracias!)

+1

Las versiones más recientes de git requieren 'git rev-list --all' – maxmil

0

No sé cómo podría hacerse esto usando git log solamente, pero una solución simple sería usar git log para generar un resultado similar a CSV (con campo separado por tabuladores) y conectar este resultado a un script de python que maneja la generación JSON con la cita correcta.

+1

¿No una, en CSV también necesitará ser escapado? ¿O 'git log' hará eso? –

Cuestiones relacionadas