现在很多公司采用SVN开发,其版本管理的确很不错.
但是有一点很让人郁闷,就是源代码的.svn文件会很多,而且当Java源码代或者配置文件改变多次时,会生成很多版本,svn的大小可能是源代码的N倍.
如果想把某个目录的svn文件去掉,可以自己写个程序去删除.svn目录下的所有文件.方便又时用,我这里采用的是commons-io.jar 里的 DirectoryWalker,看到名称就能理解“目录散步”。
废话不说了,代码如下:
package com.ycl.filter.FileCleaner;import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.Collection;import java.util.List;import org.apache.commons.io.DirectoryWalker;public class FileCleaner extends DirectoryWalker { public FileCleaner() { super(); } public List<File> clean(File startDirectory) throws IOException { List<File> results = new ArrayList<File>(); walk(startDirectory, results); return results; } @Override protected void handleStart(File startDirectory, Collection results) throws IOException { System.out.println("-------开始清除-------"); } @Override protected void handleEnd(Collection results) throws IOException { System.out.println("-------结束清除-------"); } @Override protected void handleCancelled(File startDirectory, Collection results, CancelException cancel) throws IOException { System.out.println("-------清除异常-------"); super.handleCancelled(startDirectory, results, cancel); } @Override protected boolean handleIsCancelled(File file, int depth, Collection results) throws IOException { //这里可以设置断点,比如当你找到某个类的时候,停止遍历,默认继续 return false; } @Override protected void handleDirectoryStart(File directory, int depth, Collection results) throws IOException { // System.out.println("****开始处理:"+directory.getName()+"deep:"+depth+"results:"+results.toString()); } @Override protected void handleDirectoryEnd(File directory, int depth, Collection results) throws IOException { // System.out.println("****结束处理:"+directory.getName()+"deep:"+depth+"results:"+results.toString()); } @Override protected void handleRestricted(File directory, int depth, Collection results) throws IOException { System.out.println("****受限制目录:"+directory.getName()+"deep:"+depth+"results:"+results.toString()); } /** * 是否处理某个目录.返回false 不处理 * * @see 这里直接删除.svn.然后不处理. */ @Override protected boolean handleDirectory(File directory, int depth, Collection results) { // delete svn directories and then skip if (".svn".equals(directory.getName())) { deleteDirectory(directory,results); return false; } else { results.add(directory);//删除.svn,还有哪些文件夹 return true; } } /** * 删除文件,并把文件加到删除列表中 */ @Override protected void handleFile(File file, int depth, Collection results) { // delete file and add to list of deleted //file.delete(); //results.add(file); //删除.svn文件后,还有哪些文件 } /** * 删除目录及目录下的文件夹和文件 * @param directory * @param results */ private void deleteDirectory(File directory,Collection results){ if(directory.isDirectory()){ File[] list = directory.listFiles(); for(File file:list){ deleteDirectory(file,results); } } Log(directory.delete(),directory); results.add(directory);//删除文件 } /** * 删除文件或者目录失败日志 * @param flag */ private void Log(boolean flag,File directory){ if(!flag){ System.err.println("删除文件失败:"+directory.getAbsolutePath()); }else{ System.out.println("delete:"+directory.getAbsolutePath()); } }}
测试代码如下:
package com.ycl.filter.FileCleaner;import java.io.File;import java.io.IOException;import java.util.List;public class TestFileCleaner { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { // TODO Auto-generated method stub FileCleaner cleaner = new FileCleaner(); File startDirectory = new File("D:\\workspace\\branches\\pamirsshop_branches_8-30"); List<File> list = cleaner.clean(startDirectory); for(File file:list){ // System.out.println("file:"+file.getAbsolutePath()); } System.out.println("共处理"+list.size()+"个文件"); }}
测试结果如下:
...delete:D:\workspace\branches\pamirsshop_branches_8-30\deploy\src\main\.svndelete:D:\workspace\branches\pamirsshop_branches_8-30\deploy\src\main\assembly\.svn\text-base\assembly.xml.svn-basedelete:D:\workspace\branches\pamirsshop_branches_8-30\deploy\src\main\assembly\.svn\text-basedelete:D:\workspace\branches\pamirsshop_branches_8-30\deploy\src\main\assembly\.svn\prop-basedelete:D:\workspace\branches\pamirsshop_branches_8-30\deploy\src\main\assembly\.svn\propsdelete:D:\workspace\branches\pamirsshop_branches_8-30\deploy\src\main\assembly\.svn\tmp\text-basedelete:D:\workspace\branches\pamirsshop_branches_8-30\deploy\src\main\assembly\.svn\tmp\prop-basedelete:D:\workspace\branches\pamirsshop_branches_8-30\deploy\src\main\assembly\.svn\tmp\propsdelete:D:\workspace\branches\pamirsshop_branches_8-30\deploy\src\main\assembly\.svn\tmpdelete:D:\workspace\branches\pamirsshop_branches_8-30\deploy\src\main\assembly\.svn\all-wcpropsdelete:D:\workspace\branches\pamirsshop_branches_8-30\deploy\src\main\assembly\.svn\entriesdelete:D:\workspace\branches\pamirsshop_branches_8-30\deploy\src\main\assembly\.svn-------结束清除-------共处理3331个文件
记得我刚碰到svn的这个问题的时候,也是到处找工具,有没有啥工具可以去掉.svn的,现在想想,自己是程序员,遇到问题,自己开发一个不就完了嘛,实用又方便.
1 楼 langyu 2011-06-20
看到重写一堆方法就头疼,自己写递归来删
2 楼 nighty 2011-06-20
一个批处理就可以了。
for /r . %%a in (.) do @if exist "%%a\.svn" rd /s /q "%%a\.svn"echo clear done!
3 楼 iamlipeng 2011-06-20
建议你先学习一下svn的基本使用吧,使用svn自身就可以解决的基本问题,为什么要自己写程序呢?代码“检出”和“导出”的区别而已。
4 楼 vb2005xu 2011-06-20
用批处理 环能 整合到 右键菜单 多爽
5 楼 lzxz1234 2011-06-20
方法很多,你的最笨,windows系统自带搜索功能也足以,ctrl+a,shift+del
6 楼 huhu_long 2011-06-20
iamlipeng 写道
建议你先学习一下svn的基本使用吧,使用svn自身就可以解决的基本问题,为什么要自己写程序呢?代码“检出”和“导出”的区别而已。
nighty 写道
一个批处理就可以了。
for /r . %%a in (.) do @if exist "%%a\.svn" rd /s /q "%%a\.svn"echo clear done!
+1 Checkout vs Export
7 楼 bommeibo 2011-06-20
iamlipeng 写道
建议你先学习一下svn的基本使用吧,使用svn自身就可以解决的基本问题,为什么要自己写程序呢?代码“检出”和“导出”的区别而已。
+2 正解。
8 楼 cheney_love 2011-06-21
bommeibo 写道
iamlipeng 写道
建议你先学习一下svn的基本使用吧,使用svn自身就可以解决的基本问题,为什么要自己写程序呢?代码“检出”和“导出”的区别而已。
+2 正解。
楼主解决的是当svn出现异常的情况,比如因误删了某些.svn文件,导致svn本身不能导出,以前遇到过,当时写了个递归搞定。
9 楼 a123159521 2011-06-21
大家说的都有道理,可以使用系统的批处理,也可以使用svn的工具清除.
我有以下几个问题:
1. 系统dos命令,或许可以清除.svn等文件,但是能处理更复杂的情况吗?自己编写的Java程序不仅可以处理.svn,如果我只清除.svn的某些只读的文件,或指定文件呢,可扩展性绝对是自己编写逻辑最实用.
2. 使用svn的工具,如8楼所说,如果工具出问题,你怎么办,还有办法吗?,工具出问题的概念不低,使用svn的人都说明,有的时候svn会傻B的.
综上所述,自己编写程序,自己信得过.
我有以下几个问题:
1. 系统dos命令,或许可以清除.svn等文件,但是能处理更复杂的情况吗?自己编写的Java程序不仅可以处理.svn,如果我只清除.svn的某些只读的文件,或指定文件呢,可扩展性绝对是自己编写逻辑最实用.
2. 使用svn的工具,如8楼所说,如果工具出问题,你怎么办,还有办法吗?,工具出问题的概念不低,使用svn的人都说明,有的时候svn会傻B的.
综上所述,自己编写程序,自己信得过.
10 楼 fangzhu19880123 2011-06-21
lzxz1234 写道
方法很多,你的最笨,windows系统自带搜索功能也足以,ctrl+a,shift+del
+1
我一般就这么用的
11 楼 Aaron_Zhang 2011-06-21
我一般就有 xcopy WebRoot _WebRoot /i /s 回车
12 楼 a123159521 2011-06-21
fangzhu19880123 写道
lzxz1234 写道
方法很多,你的最笨,windows系统自带搜索功能也足以,ctrl+a,shift+del
+1
我一般就这么用的
如果只是简单的逻辑,你直接到目录下,删除文件都可以,如果加一些规则你就做不了了
13 楼 baidd 2011-06-21
非编译的的文件直接用导出功能,如模板,页面等。
需要编译的文件(在我们的svn中编译后的类文件没有提交到svn,svn中只提交源代码),我一般用压缩工具中的打包排除功能(写个正则,忽略.svn文件)。
需要编译的文件(在我们的svn中编译后的类文件没有提交到svn,svn中只提交源代码),我一般用压缩工具中的打包排除功能(写个正则,忽略.svn文件)。
14 楼 bluepeer 2011-06-21
不解 为什么要这样呢 SVN 不是有Export的功能吗。不就可以干净的拿出来吗?
15 楼 energykey 2011-06-21
a baby program.
16 楼 raojl 2011-06-21
1、批处理
2、revert it.
2、revert it.
17 楼 lifangling_2010 2011-06-21
这个 没事 楼主只是练习,挺好的。
18 楼 denger 2011-06-21
find . -type d -iname ".svn" -exec rm -Rf {} \;
19 楼 wmswu 2011-06-22
nighty 写道
一个批处理就可以了。
for /r . %%a in (.) do @if exist "%%a\.svn" rd /s /q "%%a\.svn"echo clear done!
denger 写道
find . -type d -iname ".svn" -exec rm -Rf {} \;