【问题标题】:How to use SVNKit to get the list of all revisions merged from one branch to another?如何使用 SVNKit 获取从一个分支合并到另一个分支的所有修订列表?
【发布时间】:2017-01-21 10:54:49
【问题描述】:

目的:

作为质量检查,我们需要确保所有合格的修订都合并到所有更高的修订。

示例:

Release_10 --> Release_11

在 TortoiseSVN 中,通过单击“显示日志”按钮很容易找出哪些修订已被合并。合并的修订通过格式和合并图标清楚地区分。

你也可以通过纯SVN列出所有合并的修订:

C:\Release_11>svn mergeinfo --show-revs merged https://svn_repo/project/branches/releases/Release_10
r32894
r32897
r32901
r32903
r32929
r32987
r32994
r32996
r33006
r33017
r33020
r33021
r33041
r33045
r33077

目前,我有列出所有修订信息的代码:

SVNURL svnURL = SVNURL.parseURIEncoded(url);
SVNRepository repository = SVNRepositoryFactory.create(svnURL);
BasicAuthenticationManager authManager = BasicAuthenticationManager.newInstance("username", "password".toCharArray());
authManager.setProxy("00.00.00.00", 8080, null, (char[])null);
repository.setAuthenticationManager(authManager);
@SuppressWarnings("unchecked")
Collection<SVNLogEntry> logEntries = repository.log(new String[] { "" }, null, 0, -1, true, true);

现在我只需要弄清楚哪些已经被合并了。

偏好:

  1. 一次调用 repo 以获取所有合并的修订。 (或者更好的是:一次调用即可获取所有修订以及它们是否被合并。)
  2. 不希望本地结帐 SVN 存储库。

注意事项:

  • 使用 SVNKIT v1.8.14,但未锁定特定版本。

【问题讨论】:

  • 你使用的是哪个版本的 svnkit?
  • SVNKIT: v1.8.14

标签: java svn svnkit


【解决方案1】:

如果您使用源和目标的绝对 URL 运行 svn mergeinfo,则不需要本地签出存储库:

svn mergeinfo --show-revs merged https://svn_repo/project/branches/releases/Release_10 https://svn_repo/project/branches/releases/Release_11

要运行此命令,在 SVNKit 1.7 或更高版本上,您可以使用SvnLogMergeInfo

SvnOperationFactory svnOperationFactory = new SvnOperationFactory();
try {
    String repo = "https://svn_repo/project/branches/releases/";
    String srcBranch = repo + "Release_10";
    String dstBranch = repo + "Release_11";

    // svnOperationFactory.setAuthenticationManager(null);

    SvnLogMergeInfo op = svnOperationFactory.createLogMergeInfo();
    op.setFindMerged(true); // --show-revs merged
    op.setSource(SvnTarget.fromURL(SVNURL.parseURIEncoded(srcBranch)));
    op.setSingleTarget(SvnTarget.fromURL(SVNURL.parseURIEncoded(dstBranch)));
    op.setReceiver(new ISvnObjectReceiver<SVNLogEntry>() {

        @Override
        public void receive(SvnTarget target, SVNLogEntry logEntry) throws SVNException {
            System.out.println("------\n" + logEntry);
        }

    });
    op.run();
} finally {
    svnOperationFactory.dispose();
}

对于旧版本,您可以使用SVNDiffClient.doGetLogMergedMergeInfo

【讨论】:

  • 这个方法对我来说需要相当多的时间,因为它不会在复制/重命名时停止。我没有看到一个选项可以让这个停止查看分支的末端。有吗?
  • @ScrappyDev 看起来svn mergeinfo 没有那个选项。您更愿意使用--show-revs eligible 吗?然后你可以检查release_10上是否有尚未合并到release_11的修订,这可能会更快。
  • 我有另一个可能的解决方案,使用“showMergedRevisions”标志可能会更快。但是,您的解决方案几乎可以工作。如果您将op.setFindMerged(false) 更改为op.setFindMerged(true),则其行为类似于--show-revs merged
  • @ScrappyDev 很好,我倒过来了。文档说:“如果应该报告合并的修订版,则为 true,如果应该报告符合合并条件,则为 false。”
  • 我编辑了您答案的那一部分,并让您的答案成为解决方案。谢谢!!
猜你喜欢
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
相关资源
最近更新 更多