格式化HTML的Git日志

时间:2015-07-02 20:39:56

标签: git bash git-bash

我正在尝试生成git log提供的信息的HTML格式输出。我是bash的初学者,所以当我搜索网络和StackOverflow寻求帮助时,我很可能错过了显而易见的事情。

我正在尝试的是在div标签中输出每个提交语句(过去5个语句)。在div内部,我想要一个提交消息主题的头,一个作为提交主体的段落,然后是一个具有更改类型(创建,删除或修改)的受影响文件列表。我的剧本很接近。它创建标题,它创建文件列表(没有更改类型),它可以以两种不正确的方式之一显示消息正文。主体每行有一个单词(就像在下面的脚本中一样)或者它将所有内容都绑定到一行(如果我只是回显$ lines变量而不对其进行for循环)。

文件列表也有类似的问题。如果我选择" - name-status",它会给我更改类型和文件名,但是在不同的行上。这就是为什么目前名单查找" - 仅限名称"。它有效,但它没有给我所有我想要的信息。

这是我当前的bash脚本:

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

如果我有这样的提交声明:

  

我的提交标题

     

提交第一行

     

提交第二行

它会影响以下文件:

  

file1.txt

     

FILE2.TXT

我会得到这样的输出:

<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>

显然,这不是我想要的。所以,我的两个问题是:

  1. 如何让提交体每个物理行有一行(不是每个空格一行)?
  2. 如何在没有与提交消息相同的问题的情况下获取与文件关联的更改类型?基本上,我正在寻找&#34;(M)file1.txt&#34;或类似的东西。
  3. 它不应该影响任何东西,但我在Windows上运行git。

    编辑:解决方案

    感谢VonC和评论者的帮助,我能够完成我的脚本。我在第一个循环中使用了IFS,然后通过while语句而不是for循环运行第二个循环。以下是工作结果:

    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
    

1 个答案:

答案 0 :(得分:2)

看起来像“How to read complete line in 'for' loop with spaces”:

尝试将分隔符IFS设置为dbo.GenColUpdated(@ColCounter,@ColTotal) = @ColUpdatedTemp

\n

HuStmpHrrr建议in the comments

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