SVN:稀疏更新以仅创建中继

时间:2015-05-11 14:23:39

标签: svn tortoisesvn

我已经查看了几个只检查svn中继的解决方案。根据红皮书,我们有一个传统的svn设置,即

/
|-- /branches
|-- /tags
`-- /trunk
    |-- foo
    `-- bar

问题是我们有100个项目,所有maven模块。每个项目都遵循上述结构。

我想找到我们仓库的根,并检查每个项目,以便我有一个类似于以下的结构:

A/
 `-- /trunk
    |-- foo
    `-- bar
B/
 `-- /trunk
    |-- foo
    `-- bar
C/
 `-- /trunk
    |-- foo
    `-- bar
... etc...

我使用TortoiseSVN并使用更新到修订版的选项 - >选择项目并取消选择所有标签和分支。

这提供了以下输出方式:

Sparse update tags, depth 'Exclude'
C:\svnrepo\A\tags
Sparse update branches, depth 'Exclude'
C:\svnrepo\A\branches
Sparse update trunk, depth 'Fully recursive'
C:\svnrepo\A\trunk

我想要做的是不必点击所有这些标签和分支复选框。 TortoiseSVN有办法实现这一目标吗?有没有人有一个可以在Windows上运行的脚本并运行相应的命令行来排除每个项目的每个标签和分支?我看过这里,但没有多大意义:

http://svnbook.red-bean.com/en/1.5/svn.advanced.sparsedirs.html

2 个答案:

答案 0 :(得分:1)

好的,没有PC,但Windows浴室脚本会是这样的:

svn co --depth=immediates %REPO% projects
cd projects
for /D %%d in (*) do svn up --set-depth=infinity %%d/trunk

我没有确切的设置,因此我无法说明这是否有效,或者您必须首先进入%%d,然后执行{{1然后svn --set-depth=infinity trunk进入下一个项目。但是,这将使您了解如何将Windows批处理脚本与cd ..命令行客户端结合起来,以便通过GUI客户端轻松完成。

当然,问题在于为什么要查看每个项目(100个项目),除非您真正在处理所有数百个项目。这可能需要非常长的时间来处理。当你真正进入某个特定项目工作时,无论如何它都会过时。

你可能会更好地使用稀疏检查来检查每个项目(也许是主干),然后当你真正需要处理项目时,在项目中执行`svn up --set-depth = infinity&#39 ; s trunk目录。也许这样的事情可能会更好:

svn

然后,您可以在实际处理项目时执行svn co --depth=immediates %REPO% projects cd projects for /D %%d in (*) do svn up --set-depth=empty %%d/trunk

答案 1 :(得分:0)

回答我自己的问题。作为一名Java开发人员,我的shell技能并不是顶尖的,所以决定最终投入Java。

使用不那么快的SVNKIT,我能够创建这个方法。我把它全部保存在一个方法中,以便在这里发布,希望它能帮助其他人,至少作为一个指针,如果不是解决方案。它是针对Java 7构建的。

...

public void doRootCheckout(Path workingCopyDirectory) throws SVNException, IOException {
    // Following advice from: http://stackoverflow.com/a/14386871/1279002
    final SvnOperationFactory svnOperationFactory = new SvnOperationFactory();

    // USERNAME/PASSWORD are the svn username and passwords. 
    // Clearly you will need to use your own!                 
    svnOperationFactory.setAuthenticationManager(SVNWCUtil.createDefaultAuthenticationManager(USERNAME, PASSWORD.toCharArray());

    try {
        final SvnCheckout checkout = svnOperationFactory.createCheckout();
        checkout.setSingleTarget(SvnTarget.fromFile(workingCopyDirectory.toFile()));

        // repoUrl is the url of your SVN repository and in this 
        // example is a UTF-8 string, e.g. http://my.repo.com/java
        SVNURL url = SVNURL.parseURIEncoded(repoUrl);
        checkout.setSource(SvnTarget.fromURL(url));
        checkout.setAllowUnversionedObstructions(false);

        // Our local clients are fixed at the 1.7 svn format so had to set this here
        checkout.setTargetWorkingCopyFormat(ISVNWCDb.WC_FORMAT_17);

        // This solution is somewhat inefficient as it first
        // checks out all the code from the root of the repoUrl
        // including all tags and branches.
        // This can take a long time...
        checkout.setDepth(SVNDepth.INFINITY);
        checkout.run();

        // When the full checkout is completed we
        // need to iterate through all the directories 
        // and exclude all tags and branches... 
        // This also can take a long time...        
        Files.walkFileTree(workingCopyDirectory, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {

                if (dir.endsWith("tags") || dir.endsWith("branches")) {
                    System.out.println("Excluding: " + dir.toAbsolutePath().toString());
                    SvnUpdate svnUpdate = svnOperationFactory.createUpdate();
                    svnUpdate.setDepth(SVNDepth.EXCLUDE);
                    svnUpdate.setDepthIsSticky(true);
                    svnUpdate.setSingleTarget(SvnTarget.fromFile(dir.toFile()));
                    try {
                        svnUpdate.run();
                    } catch (SVNException e) {
                        e.printStackTrace();
                    }
                }
                return FileVisitResult.CONTINUE;
            }
        });

    } finally {
        svnOperationFactory.dispose();
    }

}

...