【问题标题】:SVN: Is it possible to get the list of revision numbers for given path?SVN:是否可以获得给定路径的修订号列表?
【发布时间】:2009-10-27 21:02:00
【问题描述】:

我正在制作一个连接到存储库、下载提交列表并将它们存储在本地的 PHP 工具。但是,由于某些存储库可能很大并且获取它们的日志会导致等待时间长并且可能出现超时/错误,我想使用异步请求下载每个提交消息。

所以,我在修订历史中有一个起点和终点,我可以像这样抓取所有日志:

svn log -r <from_revision>:<to_revision> <REPO_URL>

...我最终可能会得到一个非常庞大的 XML 文件,以至于需要很长时间才能下载、需要很长时间和大量的资源来解析以及需要很长时间来存储。

如果我知道起点和终点,我可以创建一个 for() 循环来逐个抓取修订:

svn log -r <revision> ...

但是,由于我不知道给定路径存在哪些特定修订,因此我会收到错误消息。我可以让应用程序在更新期间忽略该错误,但这是一个讨厌的 hack,它会发布请求并等待响应 - 这一点都不好。

所以,我需要这样的东西:

  • “给我这个路径的修订号列表”,或者:
  • "给我这个路径的修订号列表,在和之间

这样我就可以为存储库路径创建一组有效的修订版本并一个接一个地获取它们。

欢迎所有建议,在此先感谢。

【问题讨论】:

  • 您是否考虑过使用 SVN 绑定而不是调用 SVN CLI 可执行文件? IIRC,它们已经存在于 PHP 中。这将是一个更加程序化且不易出错的界面。

标签: svn revision subdirectory


【解决方案1】:

我认为您最好的选择是执行以下svn log -l 100 0:{$newest} .\,它将检索给定目录或文件的前 100 个日志。然后读取返回的最后一个修订号,然后请求下一个 100 svn log -l 100 {$last_ret_log}:{$newest} .\

这样您每次请求都会获得 99 个新的日志条目,但不会全部获得。

【讨论】:

  • 哦,我应该补充一点,在第一次抓取时,您可能想要删除 #:# 位,因为您不知道第一个修订版是什么。哎呀。
  • 这听起来像是一个很好的妥协。每次迭代获取许多日志,但不要获取太多日志。顺便说一句,svn log 可以用作存储库中任何路径的svn log 1:HEAD <PATH>,但是 SVN 将足够聪明,可以返回 1 和 HEAD 修订之间的日志,这些日志仅影响请求的 中确实存在的路径。跨度>
  • 很高兴知道。我通常使用版本来满足我所有的颠覆需求。但是我有一些脚本可以解析 svn 日志以提供给管理人员。 :)
  • 命令末尾的反斜杠是什么?在 Unix 中,这意味着命令将在下一行继续。如果我删除它,我会收到错误 svn: E200007: When specifying working copy paths, only one target may be given
  • 为此我得到了svn: E020024: Error resolving case of '0:{$newest}'
【解决方案2】:

如果您有权访问 Subversion 服务器上的存储库树,则可以使用 svnlook history 获取修订号列表。

更多详情请访问http://svnbook.red-bean.com/en/1.1/re49.html

【讨论】:

  • 哎呀,你几乎解决了这个问题,但唯一的问题是svnlook 不适用于 URL。此应用程序将主要用于使用 URL 而非路径检索数据远程存储库:(
  • 谢谢!这可能解决了我的问题。当您单击路径上的显示日志时,这是否返回与 TortoiseSVN 返回相同的转速?
【解决方案3】:

我一直在尝试获得类似的结果。 我只想要特定分支的所有修订号。

我发现以下内容很有帮助。

svn log <svn_server_path> | grep "^r[0-9]\+ | " | cut -d' ' -f1 | cut -c2- > revisions.csv

这给了我一个文件,所有的修订号都在不同的行上。

希望您或其他人会发现它对您有所帮助。

我们的 repo 有超过 25000 次修订,生成这个文件需要几秒钟。

【讨论】:

    【解决方案4】:

    您可能想查看svn list。 所以为了你的目的:


    $ svn list --verbose file:///var/svn/repos
         16 sally         28361 Jan 16 23:18 README.txt
         27 sally             0 Jan 18 15:27 INSTALL
         24 harry               Jan 18 11:27 examples/
    

    这列出了任何文件的最后(头)修订。

    【讨论】:

    • 谢谢,但这并没有列出所有的修订,只是每个路径的最后一个。
    【解决方案5】:
    svn log url -l limitNumber - r fromReversion:toReversion
    

    如果你想找到下一个更旧(更小)的回归(版本) 例如

       svn log url -l 4 -r someVersion:1
     or
       svn log url -l 4 -r 99: 3
    

    fromReversion 大于 toReversion 如果你想找到下一个更新(更大)的回归(版本)

      svn log url -l 4 -r someVersion:head
    or   
      svn log url -l 4 -r 3:99
       fromReversion lower than toReversion
    

    【讨论】:

      猜你喜欢
      • 2015-01-01
      • 1970-01-01
      • 2015-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-24
      • 2013-11-29
      • 1970-01-01
      相关资源
      最近更新 更多