Как отобразить коммиты конкретного пользователя в логе svn? - PullRequest
157 голосов
/ 21 декабря 2010

Как отобразить коммиты конкретного пользователя в svn? Я не нашел никаких переключателей для этого для журнала SVN.

Ответы [ 11 ]

252 голосов
/ 21 декабря 2010

Вы можете использовать это:

svn log | sed -n '/USERNAME/,/-----$/ p' 

Он покажет вам каждый коммит, сделанный указанным пользователем (ИМЯ ПОЛЬЗОВАТЕЛЯ).

UPDATE

Как подсказывает @bahrep, subversion 1.8 поставляется с опцией --search.

95 голосов
/ 31 июля 2013

С Subversion 1.8 или новее:

svn log --search johnsmith77 -l 50

Помимо совпадений авторов, это также включает SVN-коммиты, содержащие это имя пользователя в сообщении о коммите, что не должно происходить, если ваше имя пользователя не является общим словом.

-l 50 ограничит поиск последними 50 записями.

--search ARG

Фильтрует сообщения журнала, чтобы показывать только те из них, которые соответствуют шаблону поиска ARG.

Сообщения журнала отображаются только в том случае, если предоставленный шаблон поиска соответствует какому-либо из автора, дате, тексту сообщения журнала (если не используется --quiet) или, если также указана опция --verbose, измененному пути.

Если предусмотрено несколько параметров --search, отображается сообщение журнала, если оно соответствует любому из предоставленных шаблонов поиска.

Если используется --limit, он ограничивает количество искомых сообщений журнала, а не ограничивает вывод определенным количеством совпадающих сообщений журнала.

http://svnbook.red -bean.com / о / 1,8 / svn.ref.svn.html # svn.ref.svn.sw.search

17 голосов
/ 21 декабря 2010

svn не имеет встроенных опций для этого. У него есть опция svn log --xml, позволяющая вам самостоятельно проанализировать вывод и получить интересные детали.

Вы можете написать скрипт для его анализа, например, в Python 2.6:

import sys
from xml.etree.ElementTree import iterparse, dump

author = sys.argv[1]
iparse = iterparse(sys.stdin, ['start', 'end'])

for event, elem in iparse:
    if event == 'start' and elem.tag == 'log':
        logNode = elem
        break

logentries = (elem for event, elem in iparse
                   if event == 'end' and elem.tag == 'logentry')

for logentry in logentries:
    if logentry.find('author').text == author:
        dump(logentry)
    logNode.remove(logentry)

Если вы сохраните вышеизложенное как svnLogStripByAuthor.py, вы можете вызвать его как:

svn log --xml other-options | svnLogStripByAuthor.py user
13 голосов
/ 22 марта 2013

Поскольку все, кажется, склоняются к Linux (и др.): Вот эквивалент Windows:

svn log [SVNPath]|find "USERNAME"
8 голосов
/ 21 декабря 2010
svn log | grep user

работает по большей части.

Или, если быть более точным:

svn log | egrep 'r[0-9]+ \| user \|'
5 голосов
/ 06 июня 2013

Несмотря на то, что решение yvoyer работает нормально, здесь используется вывод XML SVN, который разбирается с xmlstarlet.

svn log --xml | xmlstarlet sel -t -m 'log/logentry' \
  --if "author = '<AUTHOR>'" \
  -v "concat('Revision ', @revision, ' ', date)" -n -v msg -n -n

Отсюда вы можете перейти к более сложным запросам XML.

3 голосов
/ 06 января 2016

Начиная с Subversion 1.8, вы можете использовать опции командной строки --search и --search-and с svn log command .

Так что это должно быть так же просто, как запустить svn log --search JohnDoe.

3 голосов
/ 02 августа 2013

Вот мое решение с использованием xslt.Однако, к сожалению, xsltproc не является потоковым процессором, поэтому вы должны указать ограничение log.Пример использования:

svn log -v --xml --limit=500  | xsltproc --stringparam author yonran /path/to/svnLogFilter.xslt  - | xsltproc /path/to/svnLogText.xslt  - | less

svnLogFilter.xslt

<!--
svnLogFilter.xslt

Usage: (note: use double dashes; I can't do double dashes in a XML comment)
svn log -xml | xsltproc -stringparam author yonran svnLogFilter.xslt -
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:param name="author" select="''"/>
  <xsl:strip-space elements="log"/>
  <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
  <xsl:variable name="lowercase" select="'abcdefghijklmnopqrstuvwxyz'"/>
  <xsl:variable name="lowercaseAuthor" select="translate($author, $uppercase, $lowercase)"/>

<xsl:template match="/log">
  <xsl:copy>
    <xsl:apply-templates name="entrymatcher"/>
  </xsl:copy>
</xsl:template>

<xsl:template name="entrymatcher" match="logentry">
  <xsl:variable name="lowercaseChangeAuthor" select="translate(author, $uppercase, $lowercase)"/>
  <xsl:choose>
    <xsl:when test="contains($lowercaseChangeAuthor, $lowercaseAuthor)">
      <xsl:call-template name="insideentry"/>
    </xsl:when>
    <!--Filter out-->
    <xsl:otherwise/>
  </xsl:choose>
</xsl:template>


<xsl:template name="insideentry" match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

svnLogText.xslt

<!--
svnLogText.xslt

Usage: (note: use double dashes; I can't do double dashes in a XML comment)
svn log -xml -limit=1000 | xsltproc svnLogText.xslt -
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:param name="author" select="''"/>
  <xsl:param name="xml" select="false()"/>
  <xsl:output method="text"/>

<xsl:template match="/log">
  <xsl:apply-templates name="entrymatcher"/>
  <xsl:text>------------------------------------------------------------------------&#xa;</xsl:text>
</xsl:template>

<xsl:template name="entrymatcher" match="logentry">
  <xsl:text>------------------------------------------------------------------------&#xa;</xsl:text>
  <xsl:text>r</xsl:text><xsl:value-of select="@revision"/>
  <xsl:text> | </xsl:text>
  <xsl:value-of select="author"/>
  <xsl:text> | </xsl:text>
  <xsl:value-of select="date"/>
  <xsl:text>&#xa;&#xa;</xsl:text>
  <xsl:if test="paths">
    <xsl:text>Changed paths:&#xa;</xsl:text>
    <xsl:for-each select="paths/path">
      <xsl:text>   </xsl:text>
      <xsl:value-of select="@action"/>
      <xsl:text> </xsl:text>
      <xsl:value-of select="."/>
      <xsl:text>&#xa;</xsl:text>
    </xsl:for-each>
  </xsl:if>
  <xsl:text>&#xa;</xsl:text>
  <xsl:value-of select="msg"/>
  <xsl:text>&#xa;</xsl:text>
</xsl:template>

</xsl:stylesheet>
1 голос
/ 07 марта 2014

Для получения diffs вместе с регистрацией.

Получить номера ревизий в файл:

svn log | sed -n '/USERNAME/,/-----$/ p'| grep "^r" 

Теперь прочитайте файл и выполните diff для каждой ревизии:

while read p; do   svn log -v"$p" --diff ; done < Revisions.txt 
1 голос
/ 18 апреля 2012

Вы можете использовать Perl для фильтрации журнала по имени пользователя и поддерживать сообщения о фиксации. Просто установите переменную $ /, которая решает, что представляет собой «строку» в Perl. Если вы установите это в качестве разделителя записей журнала SVN, Perl будет читать по одной записи за раз, и тогда вы сможете сопоставить имя пользователя во всей записи. Смотрите ниже:

svn log | perl -ne 'BEGIN{$/="------------------------------------------------------------------------"} print if /USERNAME/'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...