git log – cómo get una salida xml

Necesito que todos los cambios en una twig sean procesados ​​por una aplicación que implemente una lógica de implementación especial.
Por lo less, necesitaría get:

  • cometer sha1
  • Fecha de cometer
  • Lista de files cambiados y tipo de cambio para cada

ya que es probablemente trivial get adicionalmente:

  • Commit author
  • notas de compromiso

Me gustaría agarrarlos también. La salida debe ser XML.

Sé que hay scripts Perl que crearán una salida JSON, pero me gustaría seguir con XML.

He intentado con las opciones de formatting bonito pero no puedo encontrar un marcador de position para los cambios y estoy ejecutando
git log -10 --name-status --pretty=format:"<entry><author>%an</author><commit_date>%cd</commit_date><message_body>%N</message_body></entry>" -- databases/
simplemente vuelca los cambios entre las inputs …

Escribí un script awk que analiza el resultado, pero me gustaría encontrar algo más "nativo". hay algo por ahí? Tal vez una opción que me estoy perdiendo?

para cualquiera que esté tan interesado, aquí hay un script awk que hace lo que quiero. Aún no estoy seguro de por qué tiene que ejecutarse en gawk en un Mac, pero funciona muy bien en cygwin.

 # script to parse the output of git log --name-status BEGIN{ RS="commit "; FS="\n"; print "<log>"; } NR>1{ StartComment=0; CommentText = ""; CommitText = ""; AuthorText = ""; DateText = ""; ChangesText = ""; isLast = 0; for(i = 1; i <= NF; i++) { if (i==1) {CommitText = $i;} if (match($i,/^Author/)) { #remove "author :" split($i,author1,": "); split(author1[2],author2," <") AuthorText = author2[1];} else if (match($i,/^Date/)) {StartComment=1; ln=i; #remove "date :" split($i,dt,": "); DateText = dt[2]; #trim whitespaces gsub(/^[ \t]+/,"",DateText); } else if (match($i,/^[AZ]\s/)) {StartComment=0; if(match($i,/\.sql$/)){ j = i+1 ch_path = substr($i,2) gsub(/^[ \t]+/,"",ch_path); unitChange = "\t\t\t<change>\n\t\t\t\t<ChangeType>"substr($i,1,1)"</ChangeType>\n\t\t\t\t<Path>"ch_path"</Path>\n\t\t\t</change>"; ChangesText = ChangesText""unitChange; if (!match($(j),/^$/)){ChangesText = ChangesText"\n"} } } else if (StartComment==1 && i>ln) { {CommentText=CommentText$i"\n"} } } print "\t<entry>"; print "\t\t<commit-sha1>"CommitText"</commit-sha1>"; print "\t\t<Author>"AuthorText"</Author>"; print "\t\t<CommitDate>"DateText"</CommitDate>"; print "\t\t<Changes>"; print ChangesText; print "\t\t</Changes>"; print "\t</entry>"; } END { print "</log>" } 

git log no generará XML bien formado, y los cuerpos de post ( %s , %b , %B ) y notas (% N) son text de forma libre y, por lo tanto, pueden contener caracteres XML no válidos como control-L, corchetes angulares, o incluso la secuencia de bytes <![CDATA[ . (Esto último realmente te costará si tu codificador XML no lo maneja por ti. Hablo de la experiencia de intentar interactuar con un VCS diferente en el que alguien había pegado un script falso de Perl que no codificaba el logging de posts cuerpos. El codificador falso reemplazó los corchetes angulares y los signos y símbolos con &lt; y similares, pero no manejaba caracteres de control, y muchos posts tenían ^ Ls-ni CDATA, lo que ocurrió en un post relacionado, naturalmente, con un error al tratar con XML.)

Esto significa que debe escribir su propio codificador. Podrías hacer esto en awk (veo que incluiste una label awk) aunque probablemente yo tampoco. Recomendaría codificar text arbitrario, como cuerpos de post y notas, usando base64 o esquemas similares.

(Tenga en count que si bien es al less raro, los cuerpos de post de Git pueden incluso include ASCII NUL).