¿Salida de Git log a XML, JSON o YAML?


Esta es una pregunta bastante simple: como novato de Git, me preguntaba si hay una manera de generar mi registro de git en un archivo, preferiblemente en algún tipo de formato serializado como XML, JSON o YAML. Alguna sugerencia?

Author: Compass, 2011-01-05

5 answers

Para generar un archivo:

git log > filename.log

Para especificar un formato, como quieres todo en una línea

git log --pretty=oneline >filename.log

O desea que se envíe un formato por correo electrónico a través de un programa como sendmail

git log --pretty=email |email-sending-script.sh

Para generar JSON, YAML o XML parece que necesitas hacer algo como:

git log --pretty=format:"%h%x09%an%x09%ad%x09%s"

Este gist (no mío) formatea perfectamente la salida en JSON: https://gist.github.com/1306223

Véase también:

 48
Author: huntar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:05

Hice algo como esto para crear un widget web api / javascript mínimo que mostraría las últimas 5 confirmaciones en cualquier repositorio.

Si está haciendo esto desde cualquier tipo de lenguaje de scripting, realmente desea generar su JSON con algo que no sea " para su carácter de cita, de modo que pueda escapar de las comillas reales en los mensajes de confirmación. (Usted los tendrá tarde o temprano, y no es bueno que eso rompa las cosas.)

Así que terminé con el terrorífico pero poco probable delimiter ^@^ y esta línea de comandos.

var cmd = 'git log -n5 --branches=* --pretty=format:\'{%n^@^hash^@^:^@^%h^@^,%n^@^author^@^:^@^%an^@^,%n^@^date^@^:^@^%ad^@^,%n^@^email^@^:^@^%aE^@^,%n^@^message^@^:^@^%s^@^,%n^@^commitDate^@^:^@^%ai^@^,%n^@^age^@^:^@^%cr^@^},\'';

Entonces (en nodo.js) mi cuerpo de respuesta http se construye a partir de stdout de la llamada a git log así:

var out = ("" + stdout).replace(/"/gm, '\\"').replace(/\^@\^/gm, '"');
if (out[out.length - 1] == ',') {
    out = out.substring (0, out.length - 1);
}

Y el resultado es un buen JSON que no rompe con las comillas.

 10
Author: Tim Boudreau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-11 21:28:37

Este script envuelve el registro de git y produce una salida JSON: https://github.com/paulrademacher/gitjson

 3
Author: Paul Rademacher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-20 20:12:01

Escribí esto en Powershell para obtener git logdata y guardarlo como json u otro formato:

$header = @("commit","tree","parent","refs","subject","body","author","commiter") 
[string] $prettyGitLogDump= (git log MyCoolSite.Web-1.4.0.002..HEAD --pretty=format:'%H|%T|%P|%D|%s|%b|%an|%cn;') 
$gldata = foreach ($commit in $prettyGitLogDump.Replace("; ",';') -split  ";", 0, "multiline") {
          $prop = $commit -split "\|"
          $hash = [ordered]@{}
          for ($i=0;$i -lt $header.count;$i++) {$hash.add($header[$i],$prop[$i])} 
          [pscustomobject]$hash
}
$gldata |  ConvertTo-Json | Set-Content -Path "GitLog.json" 

Los nombres de los encabezados:

"commit","tree","parent","refs","subject","body","author", "commiter"

Tiene que estar sincronizado con los campos de datos :

Pretty pretty = format: '%H / % T|%P|%D|%s|%b|%an / % cn; '

Véase prettyformat docs.
Elijo tubería | como separador. Estoy tomando un risc que no se utiliza en el mensaje de confirmación. Me punto y coma usado ; como un sep por cada compromiso. Por supuesto que debería elegir otra cosa. Podría intentar codificar alguna expresión regular inteligente para que coincida y comprobar si sus separadores se utilizan en el mensaje de confirmación. O puede codificar regularexpression más compleja para que coincida con el punto de división o codificar un bloque de scripts de powershell para definir la división.

La línea más difícil de descifrar en el código fue.

PrettyGitLogDump.Sustituir("; ",';') -dividir";", 0, "multilínea"

Tiene que establecer la opción multilínea porque puede haber CR/LF en los mensajes y luego paradas de división - solo puede establecer multilínea si se da nr de división. Por lo tanto segundo paramvalue 0 que significa todo.

(El Replace("; ",';') es solo un truco que tengo un espacio después de la primera confirmación. Así que elimino el espacio después del separador de confirmación. Probablemente hay una solución mejor.)

De todos modos creo que esto podría ser una solución viable para los usuarios de Windows o powershells los fans que quieren el registro de git para ver quién hizo el commit y por qué.

 1
Author: Patrik Lindström,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-27 14:20:45

He aquí https://github.com/dreamyguy/gitlogg , el último analizador git-log => JSON que necesitarás!

Algunas de las características de Gitlogg son:

  • Analiza el git logde múltiples repositorios en un archivo JSON .
  • Introducido repository clave/valor.
  • Introducido files changed, insertions y deletions claves/valores.
  • Introducido impact clave / valor, que representa los cambios acumulados para el commit (insertions - deletions).
  • Desinfecta las comillas dobles " convirtiéndolas en comillas simples ' en todos los valores que permiten o son creados por la entrada del usuario, como subject.
  • Casi todos los marcadores de posición pretty=format: están disponibles.
  • Incluya / excluya fácilmente qué claves/valores se analizarán en JSON comentando/descomentando los disponibles.
  • Código fácil de leer que está bien comentado.
  • Retroalimentación sobre la ejecución del script consola.
  • Manejo de errores (ya que la ruta a los repositorios necesita ser establecida correctamente).

Éxito, el JSON fue analizado y guardado. Éxito, el JSON fue analizado y guardado.

Error 001 Error 001: la ruta a los repositorios no existe.

Error 002 Error 002: la ruta a los repositorios existe, pero está vacía.

 -1
Author: Wallace Sidhrée,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-22 18:18:44