当前位置: 代码迷 >> CVS/SVN >> Java剔除svn文件
  详细解决方案

Java剔除svn文件

热度:2552   发布时间:2013-02-26 00:00:00.0
Java删除svn文件
现在很多公司采用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的.
综上所述,自己编写程序,自己信得过.
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文件)。
14 楼 bluepeer 2011-06-21  
不解 为什么要这样呢 SVN 不是有Export的功能吗。不就可以干净的拿出来吗?
15 楼 energykey 2011-06-21  
a baby program.
16 楼 raojl 2011-06-21  
1、批处理
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 {} \;

  相关解决方案