检查一个完整的 Subversion 树,不包括 tags/ 和 branches/

Checkout a complete Subversion tree excluding tags/ and branches/

我正在处理包含 100 个 Maven 子项目的公司源代码树。由于每个子项目都有自己的 branches/tags/ 子文件夹布局,因此整个树的布局如下所示:

root/
    some/intermediate/dirs/
        project1/
            branches/
                ...
            tags/
                ...
            trunk/
                ...
        project2/
            branches/
                ...
            tags/
                ...
            trunk/
                ...
        ...
        projectN/
            branches/
                ...
            tags/
                ...
            trunk/
                ...
    other/intermediate/dirs/
        projectN+1/
            ...

我需要检查所有项目的 trunk/ 版本,但不幸的是,命令 $ svn co protocol://path/to/repo/root/ 检查标签和分支的完整版本给我留下了数千个冗余源代码树并使用 永远.

另外,N是一个很大的数字,我一个个项目的主干进去查看是不切实际的。

是否有 svn 命令可以让我跳过 tags/branches/ 树?

我找到了 a blog that explains how to write a Java program to accomplish this using the SVNKit,但我希望我可以使用命令行中的一行代码完成它。

更新:首选仅使用 svn 可执行文件的解决方案,但如果需要一些 shell 脚本,我更喜欢 Windows 批处理脚本,否则,任何 bashzsh 脚本都可以...

你需要的是SVN sparse directories.

您需要一个骨架结构,并在到达 trunk 时只填写它们。类似于(Bourne shell 语法):

svn co --depth empty protocol://path/to/repo/root/
for in in some intermediate dirs; do svn up --set-depth empty $i; cd $i; done
svn up --depth immediates .
for i in *; do svn up --depth infinity $i/trunk; done

我假设 none 个有问题的目录包含空格或 shell 个元字符 - 如有必要,添加适当的引号。

使用稀疏目录时要小心 - 很容易忘记排除的内容和实际不存在的内容...

我不知道,您需要哪种输出格式,但这条批处理行可能会有所帮助:

dir /s /b /ad |findstr /v /R "\<tags\>  \<branches\>"

findstr可以用"\<word\>"搜索"words",所以不会排除moretagstagsmore。参见 findstr /?

或者如果您只对 *trunk" 子目录感兴趣:

dir /s /b /ad |findstr  "\<trunc\>" 

found 建议使用 -set-depth=exclude 而不是 --set-depth empty。 F.e.:

svn update --set-depth=exclude <foldername>

方便多了。如果在您的示例中,您在目录 some/intermediate/dirs/project1/:

中执行
svn up --set-depth empty tags

然后:

svn up

目录tags将再次出现,所有内容将被下载。因此,您只需要从后代目录进行更新。

但是有:

svn update --set-depth=exclude tags

目录将被删除,您甚至可以从root/目录中执行svn up!更新只会出现在离开目录!

要恢复初始状态和 return 所有以这种方式删除的目录,您可以这样做:

svn up --set-depth infinity .