如何将整个git log --stat输出到xml

时间:2016-08-02 22:58:12

标签: xml git

我正试图改变这个标准的git log --stat输出:

commit 8a3f15205922e524d59524fe89c4304849dd6c8c
Author: FooManChu <fooMC@email.com>
Date:   Fri Jul 15 20:33:17 2016 -0400

    Some Commit Message Body

 foodir/foofile1.foo |    8 +
 foodir/foofile2.foo |   47 +
 foodir/foofile3.foo | 7049 +++++++++++++++++++++++
 foodir/foofile4.foo | 3563 ++++++++++++
 foodir/foofile5.foo |   24 +
 foodir/foofile6.foo |    0
 foodir/foofile7.foo |   41 +
 7 files changed, 10732 insertions(+)

commit c8bd4ca8d683c20f3cf206fdeb8dbec2f185536e
Author: FooGirlChu <fooGC@email.com>
Date:   Fri Jul 15 00:11:24 2016 -0400

    Initial commit

 FOO       | 674 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 README.md |   1 +
 2 files changed, 675 insertions(+)

进入下面看到的xml文件结构。它不必像下面那样直接映射,但仍然足够接近以便在需要时进行自定义。

<?xml version="1.0" encoding="utf-8"?>
<stats>
    <commit sha1='8a3f15205922e524d59524fe89c4304849dd6c8c'>
        <author email='fooMC@email.com'>FooManChu</author>
        <date>Fri Jul 15 20:33:17 2016 -0400</date>
        <body>Some Commit Message Body</body>
        <diff-stat>
            <filepathname insertions='8'>foodir/foofile1.foo</filepathname>
            <filepathname insertions='47'>foodir/foofile2.foo</filepathname>
            <filepathname insertions='7049'>foodir/foofile3.foo</filepathname>
            <filepathname insertions='3563'>foodir/foofile4.foo</filepathname>
            <filepathname insertions='24'>foodir/foofile5.foo</filepathname>
            <filepathname insertions='0'>foodir/foofile6.foo</filepathname>
            <filepathname insertions='41'>foodir/foofile7.foo</filepathname>
        </diff-stat>
        <summary changed='7' insertions='10732'/>
    </commit>
    <commit sha1='c8bd4ca8d683c20f3cf206fdeb8dbec2f185536e'>
        <author email='fooGC@email.com'>FooGirlChu</author>
        <date>Fri Jul 15 00:11:24 2016 -0400</date>
        <body>Initial commit</body>
        <diff-stat>
            <filepathname insertions='674'>FOO</filepathname>
            <filepathname insertions='1'>README.md</filepathname>
        </diff-stat>
        <summary changed='2' insertions='675'/>
    </commit>
</stats>

我查看了Parsing Git Log OutputUnderstand Git Log Stat Output,但我无法复制--stat格式。

因此,我的问题可以在git中完成吗?或者我应该尝试编写一个解析程序,而不是将--stat作为输入并输出我的xml文件?

1 个答案:

答案 0 :(得分:1)

以下是原始答案:Parse git log file names to json

解析XML文件应类似于解析JSON文件。

这是将 git log -stat 导出为json的示例。

我们定义一个函数来加载在一个git commit

中更改的文件
function getcommit { \
git show --pretty="format:"  --name-only $1 | \
perl -pe's/^\n//g;' | \
sed 's/\(.*\)/"\1"/g' | \
perl -0pe 's/\n(?!\Z)/,\n/g'; \
}

export -f getcommit

然后使用git log -1显示最新的一个提交信息:

    git log -1 --pretty=format:'{%n  "commit": "%H",%n  "author": "%an ",%n  "date": "%ad",%n  "message": "%f",%n  "files": [ COMMIT_HASH_%H  ]%n},' | \
    perl -pe 'BEGIN{print "["}; END{print "]\n"}' | \
    perl -pe 's/},]/}]/;s/COMMIT_HASH_(\w+)/`echo -n "";getcommit $1`/e'

示例结果

    [{
    "commit": "1edcef90b42afee11fbd31dcc458ae0f15a3bb6e",
    "author": "Bertrand Martel ",
    "date": "Tue Oct 13 17:35:34 2015 +0200",
    "message": "update-readme",
    "files": [ "README.md",
        "device.png",
        "screenshot.png"
        ]
    }]