SVN - 获取文件的所有提交消息?

时间:2010-03-17 15:50:55

标签: svn logging shell

有没有办法获得按文件排序的所有提交消息的好列表?像这样的东西(你可以看到,我不希望特定于某个文件的消息,如果文件是提交的一部分,只显示整个提交的消息,重复正常):

-- index.php
    2010-01-02 03:04:05
      * added new paragraph
    2010-01-01 03:04:05
      * moved header out of index.php into header.php
      * header.php initial check-in
    2009-12-31 03:04:05
      * index.php initial check-in

-- header.php
    2010-01-03 03:04:05
      * added new meta tags
    2010-01-01 03:04:05
      * moved header out of index.php into header.php
      * header.php initial check-in

其他信息:

svn log filename做了类似的事情,但我希望它能做到这一点:

  1. 获取yyyy-mm-dd(r2)和yyyy-mm-dd(r4)之间已更改的文件列表 (即
    svn log -q -v -r 2:4 > changedfiles.txt
  2. 从changedfiles.txt
  3. 剥离无关垃圾
  4. svn记录该列表中的每个文件,如:
    svn log < changedfiles.txt >> combinedlog.txt
    (只是伪代码,我知道svn log接受参数而不是输入,但不能把它写出来)

4 个答案:

答案 0 :(得分:15)

svn log filename将显示与filename关联的所有提交消息。输出结果如下所示:

------------------------------------------------------------------------
r1206 | kalebp | 2010-03-10 16:48:12 -0800 (Wed, 10 Mar 2010) | 1 line

Introduce a TranslatorFacade. Make the jar runnable by default.
------------------------------------------------------------------------
r1085 | kalebp | 2010-03-02 17:10:28 -0800 (Wed, 04 Nov 2009) | 1 line

Annotation checker now supports complete definitions and named parameters
------------------------------------------------------------------------
...

如果您不想在分支或副本之前获得信息,则可以添加--stop-on-copy选项。有关详细信息,请参阅svn help log,例如如何指定日期范围等。

修改

您可以使用svn log -r{20100101}:{20100331}轻松抓住日期范围。我不喜欢为更改的文件调用log的想法,因此我建议使用-v标志来获取提交中更改的文件列表。

以下是我将使用的流程:

svn log -r{20100101}:{20100331} -v --xml | xsltproc formatter.xsl -

这是formatter.xsl:

<xsl:stylesheet
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        exclude-result-prefixes="xsd"
        version="1.0"
        >

<xsl:output method="text" indent="no" />

<xsl:key name="paths-key" match="/log/logentry/paths" use="path" />

<xsl:template match="log/logentry">
        <xsl:for-each select="paths/path[count(. | key('paths-key', paths/path)[1]) = 1]">
                <xsl:sort select="text()"/>
                -- <xsl:value-of select="text()" />
                <xsl:for-each select="key('paths-key', .)/preceding-sibling::date">
                        <xsl:sort select="translate(text(), '-:.T','')"/>
                        <xsl:variable name="selectedDate" select="text()"/>
                        <xsl:value-of select="translate($selectedDate, 'T', ' ')"/><xsl:text>
                        </xsl:text>
                        <xsl:for-each select="following-sibling::msg">
                                * <xsl:variable name="msg" select="text()"/>
                                <xsl:variable name="date" select="preceding-sibling::date/text()"/>
                                <xsl:if test="$selectedDate = $date">
                                        <xsl:text>   </xsl:text>
                                        <xsl:value-of select="$msg"/>
                                </xsl:if>
                        </xsl:for-each>
                </xsl:for-each>
        </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

答案 1 :(得分:3)

我想svn log --xml和某种命令行XPath或XSLT将是你最好的选择。

答案 2 :(得分:1)

使用命令svn log

答案 3 :(得分:1)

您可能需要的不仅仅是SVN,而是以编程方式完成此操作。如果.Net不是问题,我建议SharpSVn。下面的代码应该让你有所启动。

var la = new SvnLogArgs { Start = 16077, End = 17445  };
Collection<SvnLogEventArgs> list;
client.GetLog(new Uri(_respositoryPath), la, out list);

foreach (SvnLogEventArgs a in list)
{
    // ...jazz
}