检查一个完整的 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 批处理脚本,否则,任何 bash
或 zsh
脚本都可以...
你需要的是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",所以不会排除moretags
或tagsmore
。参见 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 .
我正在处理包含 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 批处理脚本,否则,任何 bash
或 zsh
脚本都可以...
你需要的是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",所以不会排除moretags
或tagsmore
。参见 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 .