git log --pretty与文件列表?

时间:2012-06-19 03:15:13

标签: git

我正在尝试使用'git log --pretty = tformat'来创建xml文件日志。但是我在获取每个提交的文件列表时遇到问题。

例如: 我用这个命令

$echo '<?xml version="1.0"?>' > out.xml
$echo '<git>' >> out.xml
$git log   --pretty=tformat:'    <commit>%n        <h1>%s</h1>%n    </commit>'  --name-only  >> out.xml
$echo '</git>'>> out.xml

输出:

    <?xml version="1.0"?>
<git>
    <commit>
        <h1>Commit 1</h1>
    </commit>
    <commit>
        <h1>Commit 2</h1>
    </commit>
    <commit>
        <h1>Commit 3</h1>
    </commit>
</git>

我想在提交标记的一侧添加标记和文件列表,这样我的最终输出就像这样

    <?xml version="1.0"?>
    <git>
        <commit>
            <h1>Commit 1</h1>
            <list>file1</list>
        </commit>
        <commit>
            <h1>Commit 2</h1>
            <list>file2</list>
        </commit>
        <commit>
            <h1>Commit 3</h1>
            <list>file3</list>
        </commit>
    </git>  

我确实尝试过--name-only它会列出文件但不能格式化输出。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

这可能不是你想要的,但它很容易编写脚本。以下是一种实施方式,效率低但功能齐全。小心运行它:它将在你的整个历史中运作。将第二行更改为revlist=$(git rev-list -10 HEAD)以查看它仅适用于最后10次提交。根据上面的示例,它还假设您希望在文件底部提交较旧的提交。如果您更喜欢按时间顺序排列,请在--reverse添加git rev-list标记:

#!/bin/sh
revlist=$(git rev-list HEAD)
(
    echo '<?xml version="1.0"?>'
    echo '<git>'
    for rev in $revlist
    do
            files=$(git log -1 --pretty="format:" --name-only $rev)
            echo '    <commit>\n        <h1>\c'
            echo "$(git log -1 --pretty="%s" $rev)\c"
            echo '</h1>'
            for file in $files
            do
                    echo "        <list>$file</list>"
            done
            echo '    </commit>'
    done
    echo '</git>'
) > out.xml

答案 1 :(得分:0)

我设法将所有文件信息作为单个文本字段获取,然后使用以下powershell脚本对文件进行一些小的操作(将前两行移动到文件的末尾):(将REPONAME替换为名称存储库,可以进一步自动化。)

git --git-dir <path to repository> log --name-only --pretty=format:"]]></files>%n</commit>%n<commit>%n<repo>REPONAME</repo>%n<hash>%H</hash>%n<author>%an</author>%n<dt>%ct</dt>%n<subject><![CDATA[%s]]></subject>%n<files><![CDATA[" | Out-File REPONAME.xml
$x = get-content REPONAME.xml
@("<gitrepo>") + $x[2..$x.count] + $x[0..1] + @("</gitrepo>") | set-content REPONAME.xml

要分割文件,我必须在数据库中进行一些进一步的处理(拆分换行等),但这不在本答复范围内。

这将输出一个类似于:

的文件
<gitrepo>
<commit>
<repo>REPONAME</repo>
<hash>388d77493cb2b4d3260cd12b1adcf23e947755f4</hash>
<author>Some Guy</author>
<dt>1401802177</dt>
<subject><![CDATA[Comments added to files]]></subject>
<files><![CDATA[
src/aben/blanksid.w
src/aben/c_typop.w
src/aben/freg.w
src/aben/freskid.w
src/aben/grit5.w
src/aben/grokli.w

]]></files>
</commit>
</gitrepo>