如何批量从svn仓库中删除文件/目录

5
使用工具:VisualSVN Server、TortoiseSVN、AnkhSVN。
我使用TortoiseSVN对所有的.NET项目和相关资源进行了初始仓库加载。我计划使用TortoiseSVN进行一般的源代码控制操作,使用AnkhSVN在Visual Studio解决方案中进行操作。
我的问题是,我的仓库现在有开发人员/机器特定的文件/目录,而这些我不需要。我知道Ankhsvn是通过使用Microsoft的SCC API来排除它们的,如果你从Visual Studio中添加解决方案到仓库中。
所以现在我需要批量删除SVN仓库中必要的文件/目录。这些包括(但我可能会添加更多):
thumbs.db Thumbs.db *.bak *.class *.exe *.dll *.mine *.obj *.ncb *.lib *.log *.idb *.pdb *.ilk *.msi* .res *.pch *.suo *.exp *.*~ *.~* ~*.* cvs CVS .CVS .cvs release Release debug Debug ignore Ignore bin Bin obj Obj Generated Logs *.csproj.user *.user

我如何做到不逐个处理呢?

额外信息:

一个想法是Micha提出的在这里,但必须在移动到代码库之前执行。

2个回答

4
我建议开发人员在使用VisualStudio项目时使用AnkhSVN而不是TortoiseSVN。AnkhSVN不允许您将私有用户文件检入到VIsualStudio项目中。
要删除这些文件,您必须先检出存储库以删除单个文件。没有绕过这个步骤的方法。很抱歉...
首先,您需要列出VisualStudio文件的列表,这些文件不应该在您的Subversion存储库中
然后,您应该获取Subversion客户端的Windows命令行版本。您可以从SlikSVN获取此版本。基于命令行的Subverison客户端将允许您以编程方式删除不想要的文件,而无需逐个处理它们。
例如,如果您使用Cygwin在Windows系统上提供类似GNU/Linux环境,您可以执行以下操作:
$ svn checkout $repo-project $workdir
$ find $workdir \( -name "*.suo" -o -name "*.csproj.user" \) -exec svn delete {} \;
$ svn commit -m"Removing all VisualStudio private files from repo" $workdir

或者你可以编写一个简短的 Perl、Python,甚至 PowerShell 程序来帮助你完成这个任务。

如果你不了解 PowerShell,那么这可能是一个很好的 PowerShell 初学者项目。自 Windows XP 以来,所有版本的 Windows 都附带有 PowerShell。PowerShell 是一种非常强大的脚本语言——比 Windows 批处理要强大得多,甚至比 Bash shell 脚本还要强大。它相当于 Python 或 Perl 在脚本功能方面的威力。我只是不明白为什么在基于 Windows 的开发网站中它如此少用。但是,如果你学会了它,你会发现它是一种强大的 Windowy 工具。PowerShell 与 Windows 注册表、IIS 和各种系统服务集成。

删除所有这些用户文件后,你可以使用 Subversion 预提交钩子 将它们永久地移出你的 Subversion 存储库。控制文件条目应类似于:

[FILE You cannot add private user files into a VisualStudio project]
match = VSproject/.*/\.(suo|user|webinfo|dll|exe)$
access = no-add
users = @ALL

谢谢!PowerShell的强大确实被误解了!有一个问题。NuGet包目录怎么办?我也想把它们放在仓库里,所以排除它们(*.dll,*.exe)对我来说不适用。这样做太糟糕了吗? - e4rthdog
您可以按用户指定某个用户可以添加它们,而其他用户则不能。no-add允许更新和删除,但不能添加。您还可以指定这些内容允许在“nugget packages”目录中。match是对目录/文件模式的正则表达式匹配。此外,规则的顺序从上到下。一个规则可以取消权限,而下面的规则可以重新添加权限。您可以创建一个全局规则,然后在文件中稍后添加规则以进行例外处理。 - David W.
1
我对知道PowerShell的人如此之少感到震惊。我将90%的时间花在非微软领域中,如Tomcat和JBoss而不是.NET。然而,我偶尔也会在Windows环境下工作,并且会用Powershell来解决问题。虽然我不是PS专家,但我可以看出它非常强大。我对那些整天生活在MSWorld中甚至不知道PowerShell存在的人感到震惊。看看Stackoverflow上的Powershell标签和Perl标签之间的差异。我无法相信PS使用如此之少。 - David W.

0

最好的方法是在导入到SVN之前在VS中进行清理。

如果文件仍然在存储库中,我建议进行两个检出。其中一个打开VS并进行清理,然后对两个检出进行基于文件/目录的比较(并删除差异)。


虽然这并没有解决文件已经在仓库中的问题,但这是一个好主意。另一种方法是在添加到仓库之前更新tortoiseSVN的忽略规范,这样它就会变得干净。导出所有-修改忽略-再次导入。 - e4rthdog
第二部分解决问题还是忽略事实?你的想法听起来很有趣。 - Micha
我使用了那个...我更新了忽略TortoiseSVN设置,删除了.svn目录和来自repo的文件夹,然后重新导入它...它完美地工作了。 - e4rthdog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接