git log - 如何获取xml输出

时间:2016-11-27 13:18:11

标签: xml git awk

我需要让分支中的所有更改由实现特殊部署逻辑的应用程序进一步处理 至少我需要得到:

  • commit sha1
  • 提交日期
  • 每个
  • 的已更改文件列表和更改类型

因为额外获得可能是微不足道的:

  • 提交作者
  • 提交说明

也希望抓住这些。输出需要是XML。

我知道有一些perl脚本会创建一个JSON输出,但我想坚持使用XML。

我尝试了漂亮的格式选项,但找不到更改的占位符,并且运行了
git log -10 --name-status --pretty=format:"<entry><author>%an</author><commit_date>%cd</commit_date><message_body>%N</message_body></entry>" -- databases/
只是转储条目之间的变化......

我编写了一个解析输出的awk脚本,但希望找到更“本机”的东西。那里有什么东西吗?也许我错过了一个选择?

对于任何有兴趣的人来说,这是一个awk脚本,可以满足我的需求。不知道为什么它需要在mac上运行gawk但在cygwin中以awk运行。

# 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,/^[A-Z]\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>"
}

1 个答案:

答案 0 :(得分:4)

git log不会生成格式正确的XML,而邮件正文(%s%b%B)和备注(%N)都是自由格式的文本,因此可能包含无效的XML字符,例如control-L,尖括号,甚至是字节序列<![CDATA[。 (如果您的XML编码器没有为您处理它,这最后会让您感到困惑。我说的是尝试连接到其他人粘贴了一个假的XML编码器Perl脚本的另一个VCS的经验,该脚本无法编码消息日志伪造的编码器确实用&lt;等取代了尖括号和&符号,但是没有处理控制字符 - 许多消息都有^ Ls-也没有CDATA,它们发生在一条消息中,自然就是一个处理XML时的错误。)

这意味着您应该编写自己的编码器。你可以在awk中执行此操作(我看到你包含了一个awk标签)虽然我可能不会自己。我建议使用base64或类似方案编码任意文本,例如邮件正文和注释。

(请注意,虽然它至少很少见,但Git消息体甚至可以包含ASCII NUL。)