我正在尝试生成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>
显然,这不是我想要的。所以,我的两个问题是:
它不应该影响任何东西,但我在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
答案 0 :(得分:2)
看起来像“How to read complete line in 'for' loop with spaces”:
尝试将分隔符IFS设置为dbo.GenColUpdated(@ColCounter,@ColTotal) =
@ColUpdatedTemp
。
\n
IFS=$'\n'
for line in $lines
do
echo "$line <br />"
done