我正在尝试生成git log提供的信息的HTML格式输出。我是bash的新手,所以虽然我在网上和StackOverflow上搜索了帮助,但很可能会错过显而易见的东西。
我想要输出过去5个语句的每个提交语句到一个div标签中。在div内部,我想要一个作为提交消息主题的标题,一个作为提交正文的段落,然后是一个包含更改类型(已创建、已删除或已修改)的受影响文件列表。我现有的脚本已经接近目标。它可以创建标题,创建文件列表(没有更改类型),并且可以将消息正文以两种错误方式之一显示。如果我只是echo $lines变量而没有对其进行for循环,那么正文内容就会被压缩到一行中。
文件列表也有类似的问题。如果我选择“--name-status”,它会在不同的行上给出更改类型和文件名。这就是为什么当前名称列表查找“--name-only”的原因。这样做可以工作,但它不能提供我想要的所有信息。
以下是我的当前bash脚本:
如果我有一个像这样的提交语句:
显然,这不是我想要的。所以,我的两个问题是:
编辑:解决方案
感谢VonC和那些评论者的帮助,我能够完成我的脚本。 我利用了第一个循环中的IFS,并通过while语句而不是for循环来运行第二个循环。 这是工作结果:
我想要输出过去5个语句的每个提交语句到一个div标签中。在div内部,我想要一个作为提交消息主题的标题,一个作为提交正文的段落,然后是一个包含更改类型(已创建、已删除或已修改)的受影响文件列表。我现有的脚本已经接近目标。它可以创建标题,创建文件列表(没有更改类型),并且可以将消息正文以两种错误方式之一显示。如果我只是echo $lines变量而没有对其进行for循环,那么正文内容就会被压缩到一行中。
文件列表也有类似的问题。如果我选择“--name-status”,它会在不同的行上给出更改类型和文件名。这就是为什么当前名称列表查找“--name-only”的原因。这样做可以工作,但它不能提供我想要的所有信息。
以下是我的当前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>
显然,这不是我想要的。所以,我的两个问题是:
- 如何使提交正文每行都是物理行(而不是每个空格一行)?
- 如何获得与文件相关联的更改类型而不出现与提交消息相同的问题?基本上,我正在寻找“(M) file1.txt”或类似的东西。
编辑:解决方案
感谢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