SVN - получить все сообщения коммита для файла? - PullRequest
17 голосов
/ 17 марта 2010

Есть ли способ получить хороший список всех сообщений коммитов, отсортированных по файлам? Примерно так (как вы можете видеть, я не хочу, чтобы сообщения относились к определенному файлу, просто отображать сообщения для всего коммита, если файл был частью коммита, повторяется нормально):

-- 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. получить список файлов, которые изменились между гггг-мм-дд (r2) и гггг-мм-дд (r4) (т.е.
    svn log -q -v -r 2:4 > changedfiles.txt
  2. убрать постороннее дерьмо из changefiles.txt
  3. svn регистрирует каждый файл в этом списке, как в:
    svn log < changedfiles.txt >> combinedlog.txt
    (просто псевдокод, я знаю, что svn log принимает аргументы, а не вводит, но не может потрудиться записать его)

Ответы [ 4 ]

15 голосов
/ 17 марта 2010

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 для получения дополнительной информации, например, как указать диапазоны дат и т. Д.

EDIT:

Вы можете легко получить диапазон дат, используя 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>
3 голосов
/ 17 марта 2010

Я думаю, svn log --xml, и какой-то XPath или XSLT из командной строки будет вашим лучшим выбором.

1 голос
/ 17 марта 2010

Возможно, вам нужно нечто большее, чем просто 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
}
1 голос
/ 17 марта 2010

С помощью команды svn log

...