2

基本上我希望 svn status -u 只显示特定用户更改的文件,因为这样我就可以只更新那些。

4

4 回答 4

2

这种类型的分析/报告问题在 PowerShell 中相当简单(当然仅限于 Windows)。从这个主力开始将 svn 日志数据转换为 PowerShell 对象:

Function Get-SvnLogData()
{
    ([xml](svn log -v --xml)).log.logentry | % {
        $nestedEntry = $_
        $_.paths.path | % {
            $path = $_
            $nestedEntry | Select-Object -Property `
                Author, `
                @{n='Revision'; e={([int]$_.Revision)}}, `
                @{n='Date';     e={Get-Date $_.Date  }}, `
                @{n='Action';   e={$path.action      }}, `
                @{n='Path';     e={$path.InnerText   }}`
        }
    }
}

将日志转换为对象后,PowerShell 的本机 cmdlet 提供了无数方法来处理数据。以下是解决手头问题的几种可能性:

问题1:作者x是什么时候接触过每个文件的?

显示特定作者提交的文件;一个文件可能会出现多次(包括作者每次触摸文件的时间)。

Get-SvnLogData |
where { $_.Author -eq 'smith' } |
select Revision,Date,Path | 
sort -property `
    @{ Expression="Path";     Descending=$false }, `
    @{ Expression="Revision"; Descending=$true  } |
Format-Table -AutoSize
# To sort by latest changes instead of by file,
# swap Path and Revision properties in sort statement.

问题 2:作者 x 最后一次触碰每个文件是什么时候(顺便说一下触碰了多少次)?

显示特定作者提交的文件;每个文件只出现一次,带有触摸次数和上次触摸日期。

Get-SvnLogData |
where { $_.Author -eq 'smith' } |
group Path |
select `
    @{ n='Last Touched'; e= {@($_.group | sort date -Descending)[0].date} }, `
    @{ n='NumberOfTimesTouched'; e={$_.count} }, `
    name |
sort name | Format-Table -AutoSize
# To sort by latest changes instead of by file change last line to:
# sort date | Format-Table -AutoSize
于 2012-07-05T20:59:10.527 回答
0

您将需要解析svn log(or svn status) 的输出以仅搜索该用户的条目。

如果使用svn log --xml,则可以对结果执行 XPath 查询或应用 XSLT 来执行此过滤,从而捕获具有包含所需用户名<logentry>的节点的所有节点。<author>

于 2012-07-02T17:44:04.223 回答
0

请参考下面的示例,使用带有用户名 'jainendra'的svn log 命令:

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

这里sed是一个 linux 命令。

于 2012-07-02T11:46:46.290 回答
0

尝试使用

svn log --username <username>

命令

此外,您可以添加 --limit 参数,这样您的屏幕就不会被提交填满。这是在 sed'ing svn 的输出作为用户名时无法轻易实现的。

svn log --username ankit --limit 2
于 2012-07-02T11:48:44.787 回答