2010-03-17 42 views
16

有没有一种方法可以获得按文件排序的所有提交消息的好列表?像这样的东西(你可以看到,我不想具体到某个特定文件的信息,只显示整个邮件提交如果文件的提交部分,重复OK):SVN - 获取文件的所有提交消息?

-- 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的日志接受参数没有输入,但也懒得写出来)

回答

14

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}日期范围抢。我不喜欢调用日志更改文件的想法,因此我建议使用-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> 
+0

足够接近,我正在修改你的xslt。谢谢 – davidosomething 2010-03-18 04:30:27

1

用命令svn log

+0

我将不得不脚本化并解析它(svn list获取所有内容,不要那样)来获取已更改文件的列表>> changedfiles.txt,然后按顺序在changedfiles.txt的内容上运行svn log得到一个我想要的清单。我想知道是否有更好的方法。 – davidosomething 2010-03-17 16:03:07

+0

您也可以执行svn log -v来获取完整的日志并为每个文件设置评论。 – Sjoerd 2010-03-18 08:14:07

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 
} 
3

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

+0

XPath用于访问节点,但XSLT是一个好主意,所以我在我的文章中包含了这样的解决方案。 XQuery也可以工作。 :)。 – 2010-03-17 19:24:34