Formateo de Git Log para HTML

Intento generar un resultado con formatting HTML de la información provista por git log. Soy un principiante en bash, así que mientras buscaba en la web y en StackOverflow por ayuda, bien podía haber pasado por alto lo obvio.

Lo que bash es dar salida a cada statement de compromiso (de las 5 últimas declaraciones) en una label div. Dentro del div, quiero un encabezado que sea el asunto del post de compromiso, un párrafo que sea el cuerpo del compromiso y luego una list de los files afectados con el tipo de cambio (creado, eliminado o modificado). El script que tengo está cerca. Crea el encabezado, crea la list de files (sin tipo de cambio) y puede mostrar el cuerpo del post en una de las dos forms incorrectas. O bien el cuerpo tiene una palabra por línea (como está en el script a continuación) o tiene todo en una línea (si echo la variable $ lines sin hacer un ciclo for).

La list de files tiene un problema similar. Si selecciono "–name-status", me da el tipo de cambio y el nombre del file, pero en líneas separadas. Es por eso que actualmente la list de nombres busca "–name-only". Funciona pero no me da toda la información que quiero.

Aquí está mi script bash actual:

revlist=$(git rev-list -n 5 HEAD) ( echo '<div>' for rev in $revlist do lines=$(git log -1 --pretty="format:%b" $rev) files=$(git log -1 --pretty="format:" --name-only $rev) echo '<div><h2>' echo "$(git log -1 --pretty="%s" $rev)" echo '</h2>' for line in $lines do echo "$line <br />" done echo '<h3>Files Affected</h3><ul>' for file in $files do echo "<li>$file</li>" done echo '</ul></div>' done echo '</div>' ) > out.html 

Si tengo una statement de compromiso como esta:

Mi encabezado de compromiso

comprometer línea uno

comprometer la línea dos

y afecta los siguientes files:

file1.txt

file2.txt

Voy a get un resultado como ese:

 <div><h2> My Commit Header </h2> commit <br /> line <br /> one <br /> commit <br /> line <br /> two <br /> <h3>Files Affected</h3><ul> <li>file1.txt</li> <li>file2.txt</li> </ul></div> 

Obviamente eso no es lo que quiero. Entonces, mis dos preguntas son:

  1. ¿Cómo hago para que el cuerpo de compromiso tenga una línea por línea física (no una por espacio)?
  2. ¿Cómo obtengo el tipo de cambio asociado con el file sin el mismo problema que el post de confirmación? Básicamente, estoy buscando "(M) file1.txt" o algo similar.

No debería afectar nada, pero estoy ejecutando git en Windows.

Editar: solución

Gracias a la ayuda de VonC y a los que me comentaron, pude completar mi guión. Utilicé el IFS en el primer ciclo y ejecuté el segundo ciclo a través de una instrucción while en lugar de un ciclo for. Aquí está el resultado de trabajo:

 revlist=$(git rev-list -n 5 HEAD) ( echo '<div>' for rev in $revlist do lines=$(git log -1 --pretty="format:%b" $rev) files=$(git log -1 --pretty="format:" --name-status $rev) echo '<div><h2>' echo "$(git log -1 --pretty="%s" $rev)" echo '</h2>' IFS=$'\n' for line in $lines do echo "$line <br />" done unset IFS echo '<h3>Files Affected</h3><ul>' while read change file; do if [ ${#file} -gt 0 ] then echo "<li>($change) $file </li>"; fi done <<< "$files" echo '</ul></div><hr>' done echo '</div>' ) > out.html 

Eso se ve como " Cómo leer la línea completa en 'para' el bucle con espacios ":

Intente configurar el separador IFS en \n .

 IFS=$'\n' for line in $lines do echo "$line <br />" done 

HuStmpHrrr propone en los comentarios :

 while read line; do echo "$line <br />"; done <<< "$lines"