Существует ли способ получить хороший список всех сообщений о фиксации, отсортированных по файлу? Что-то вроде этого (как Вы видите, я не хочу сообщения, характерные для определенного файла, просто показывает сообщения для всей фиксации, если файл был частью фиксации, повторения хорошо):
-- 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
делает что-то подобное, но я хочу, чтобы оно сделало это:
svn log -q -v -r 2:4 > changedfiles.txt
svn log < changedfiles.txt >> combinedlog.txt(просто псевдокод, я знаю, что журнал svn берет аргументы не вход, но не может быть побеспокоен для выписывания его),
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>
Думаю, svn log --xml
и какой-нибудь XPath или XSLT из командной строки будут вашим лучшим выбором.
Вам, вероятно, понадобится нечто большее, чем просто 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
}