论坛首页 综合技术论坛

SVN小文件清除脚本

浏览 13861 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-02-12  

隐士以前用惯了ClearCase,换到SVN有点不习惯。ClearCase下面的文件都可以直接Copy出来用,SVN下面的就麻烦了,每个目录下面一个.svn子目录,当你要把项目在Check In前拿去别用时,你就体会到你的项目不是一个项目,此刻SVN灵魂附体令你感觉别扭,当然,Check In后可以用SVN的Export来导出一个干净的项目。不爽,隐士整了个Python脚本,清除这些垃圾。

闲话不多,看脚本:

python 代码
  1. #!/usr/bin/python   
  2. # -*- coding: utf8 -*-   
  3.   
  4. #################################   
  5. #   Written by caocao           #   
  6. #   http://www.caocao.mobi      #   
  7. #   http://www.caocao.name      #   
  8. #################################   
  9.   
  10. import sysosstat  
  11.   
  12. def walk(path):   
  13.     for item in os.listdir(path):   
  14.         subpath=os.path.join(path, item)   
  15.         mode=os.stat(subpath)[stat.ST_MODE]   
  16.         if stat.S_ISDIR(mode):   
  17.             if item==".svn":   
  18.                 print "Cleaning %s ..." % subpath   
  19.                 print "%d deleted" % purge(subpath)   
  20.             else:   
  21.                 walk(subpath)   
  22.   
  23. def purge(path):   
  24.     count=0   
  25.     for item in os.listdir(path):   
  26.         subpath=os.path.join(path, item)   
  27.         mode=os.stat(subpath)[stat.ST_MODE]   
  28.         if stat.S_ISDIR(mode):   
  29.             count+=purge(subpath)   
  30.         else:   
  31.             os.chmod(subpath, stat.S_IREAD|stat.S_IWRITE)   
  32.             os.unlink(subpath)   
  33.             count+=1   
  34.     os.rmdir(path)   
  35.     count+=1   
  36.     return count  
  37.   
  38. if len(sys.argv)!=2:   
  39.     print "Usage: python SVNClean.py path"   
  40.     sys.exit(1)   
  41.   
  42. walk(sys.argv[1])  
   发表时间:2007-02-12  
为何要自己实现一个walk(),而非使用 os.walk() 函数?
0 请登录后投票
   发表时间:2007-02-12  
因为os.walk()不合要求,如果我要清除我所有进入SVN的项目里面的这类目录,文件、目录总量可能是几十万个,os.walk()比我的这个实现要慢一点,且无法进行多线程优化性能。我的这个,可以用多线程遍历和删除,没试过不知道性能能强多少。

下面是一个小测试,同样遍历我机器上的一个目录,里面有14116个目录,oswalk耗时平均比mywalk多近一秒。

引用

D:\temp>python mywalk.py
14116
0:00:17.922000

D:\temp>python oswalk.py
14116
0:00:18.844000


源码如下:

oswalk.py
import os
from datetime import datetime

path="D:\\program"
t1=datetime.now()
count=0
for dirpath, dirnames, filenames in os.walk(path):
	count+=1
	#print "%s/%s/%s" %(dirpath, dirnames, filenames)
print count
t2=datetime.now()
print t2-t1


mywalk.py
import os, stat
from datetime import datetime

def walk(path):
	count=1
	for item in os.listdir(path):
		subpath=os.path.join(path, item)
		mode=os.stat(subpath)[stat.ST_MODE]
		if stat.S_ISDIR(mode):
			count+=walk(subpath)
	return count

path="D:\\program"
t1=datetime.now()
print walk(path)
t2=datetime.now()
print t2-t1
0 请登录后投票
   发表时间:2007-02-12  
svn有一个export命令,就是导出干净的目录和文件用的。
0 请登录后投票
   发表时间:2007-02-12  
limodou 写道
svn有一个export命令,就是导出干净的目录和文件用的。


所言即是,这个命令不错,有时候并不是项目目录里面的所有文件都加入了version control,此刻该命令有点鸡肋了,索性直接copy,用这个删.svn目录,挺好。

SVN Document 写道

Name
svn export — Export a clean directory tree.

Synopsis
svn export [-r REV] URL[@PEGREV] [PATH]
svn export [-r REV] PATH1[@PEGREV] [PATH2]
Description
The first form exports a clean directory tree from the repository specified by URL, at revision REV if it is given, otherwise at HEAD, into PATH. If PATH is omitted, the last component of the URL is used for the local directory name.

The second form exports a clean directory tree from the working copy specified by PATH1 into PATH2. All local changes will be preserved, but files not under version control will not be copied.
0 请登录后投票
   发表时间:2007-02-12  
这个用shell 写的话,更简便吧.
0 请登录后投票
   发表时间:2007-02-12  
simohayha 写道
这个用shell 写的话,更简便吧.


一直紧跟python,shell编程涉入不深,只会最简单的 
windows上面貌似shell玩不转啊,要整vbs,不熟。
0 请登录后投票
   发表时间:2007-02-12  
一行shell命令搞定

find . -type f -iname ".svn" -exec rm -rf {} \; 


0 请登录后投票
   发表时间:2007-02-12  
robbin 写道
一行shell命令搞定

find . -type f -iname ".svn" -exec rm -rf {} \; 




可惜在windows下,莫非cygwin也有类似的玩意?
0 请登录后投票
   发表时间:2007-02-12  
robbin 写道
一行shell命令搞定

find . -type f -iname ".svn" -exec rm -rf {} \; 




应该是 -type d 吧,windows下可以用cygwin
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics