仅使用外部存储库之外的回购文件夹更新外部存储

时间:2020-03-27 11:24:13

标签: java svn svnkit

上下文

我们公司中有一个非常庞大的svn存储库,用于存储我们的产品。这是一个包含许多不同文件的工作区,这些文件是我们交付给客户的一部分。 由于我们所有部门都在同一个工作区中工作,因此它变得非常大(40gb +),并且由于我们无法切换到该数据的另一种管理方式,因此我受命编写一个ManagerManager来管理该工作区中的不同SVN元素(目录),并且使其以图形方式可供开发人员使用。选择一组(10-25个子目录)后,他们可以按一个按钮,MangereTool仅签​​出工作区的这一部分。

由于我们还与其他公司合作,因此我们将自己SVN存储库中的外部组件包含在我们自己的仓库中。

问题

我想在目录(“工作区/软件包/ {部门} / {主题} /外部”)中检出外部。 问题是,我们有这样的目录结构:

workspace
  >packages
      >department1
      >department2
           >subject1
           >subject2
                >payload1
                >payload2
                >external1

因此,每当我仅结帐外部文件夹时(大多数情况下是用例),我都需要结帐顶层文件夹,并使其深度不是递归的,但要小于该深度,以减小结帐的大小。 签出 workspace / packages / departement2 / subject2 之后,我然后添加 svn:external svn:external.host/svn/xx/xx/xx external1 subject2 并使用非粘性深度更新 subject2 文件夹。

public static void checkoutSvnElement(final SvnElementViewModel svnElement, final SourceSvnViewModel root)
        throws Exception {
    if (!initWorkspace(root)) {
        throw new Exception(Messages.getString("SvnHelper.error_workspace_not_initialized")); 
    }
    if (svnElement.externalProperty().getValue()) {
        addAndUpdateExternal(svnElement, root);
    } else {
        checkoutFolderInWorkspace(svnElement, root);
    }
}

private static void addAndUpdateExternal(final SvnElementViewModel svnElement, final SourceSvnViewModel rootSvnElement) throws Exception {
    try {
        final String svnPath = svnElement.svnPathProperty().getValue();
        final String localPath = svnElement.localPathProperty().getValue();
        final File targetFile = new File(PreferenceManager.getTargetTrunkPath(rootSvnElement), localPath);
        final File parentTargetFile = targetFile.getParentFile();
        final String externalFolderName = localPath.substring(localPath.lastIndexOf("/") + 1);

        final SVNPropertyValue externalProperty = SVNPropertyValue.create(String.format("\"%s\" \"%s\"", svnPath, externalFolderName)); 

        if (!parentTargetFile.exists()) {
            clientManager.getUpdateClient().doUpdate(parentTargetFile, SVNRevision.HEAD, SVNDepth.IMMIDIATE,true, true, true);
        }
        clientManager.getWCClient().doSetProperty(parentTargetFile, "svn:externals", externalProperty, false, SVNDepth.EMPTY, null, null);
        clientManager.getUpdateClient().doUpdate(parentTargetFile, SVNRevision.HEAD, SVNDepth.INFINITY, false, false, true);
    } catch (final SVNException e) {
        throw new Exception("", e);
    }
}

这里的问题是我们不想(也不能)实现整个TortoiseSVN客户端来支持开发人员的更新和提交。他们仍然应该为此使用TortoiseSVN,但是使用常规的“向上抽空工作区”命令只是删除外部,因为 subject2 的深度不是递归的。将深度级别增加到递归还会检出(和更新等) external 的同级文件夹。

尝试

我的方法之一是递归检出 subject2 ,然后排除除外部以外的所有子文件夹。但我想知道是否还有另一种方法。因为这意味着我不得不签出潜在的大量数据,然后才将其删除。另外,开发人员可能想检出外部文件夹和其中一个兼容文件夹,但不是全部。这必然会迫使我先签出所有外部文件,然后再添加非外部文件夹。除了这个事实,我会结帐两次很多数据。

你们知道如何解决这个问题吗?

0 个答案:

没有答案
相关问题