论坛首页 编程语言技术论坛

windows下清理svn文件夹的python脚本

浏览 14059 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-12-06  
用svn也是不短的时间了,有喜有忧,其中导出也是个麻烦事

文件夹里很多不能上传的文件夹都是设置的忽略(数据库连接信息等,由于用的是公用svn服务器),导出的话是看不到的,直接拷贝带svn文件夹的源目录,占用空间又至少是有用文件的两倍大小。。。

于是次次搜索.svn然后删除

后来看到个添加鼠标右键菜单的reg代码,好用是好用,迷糊的时候手一滑就game over了。。。要检出一份然后手动去添加忽略文件。。。杀人了啊。。。

看网上用python脚本写svn清理的比较多,于是学着写了个,貌似网上的脚本都是针对linux的,这个windows版的也发出来,请多指教


# -*- coding: cp936 -*-
# 注明字符集
# file:clearsvn.py 删除svn目录下的所有svn文件

import os,win32con,win32api

#清除文件名头尾的引号
def trimpath(pathin):
  #如果头部存在引号
  if pathin[0] == '\"':
    pathin = pathin[1:]
    
  #如果尾部存在引号
  if pathin[(len(pathin)-1)] == '\"':
    pathin = pathin[:(len(pathin)-1)]
  
  #返回清理首尾后的字串  
  return pathin


def clearsvn(path):
  #列出子目录
  filenames = os.listdir(path)
  
  for singlefile in filenames:
    
    pathfile = path + '\\' + singlefile
    #子目录判断是否为svn文件夹
    if os.path.isdir(pathfile):
      
      if singlefile.find('.svn') != -1:
        #是的话清理文件夹后删除文件夹
        deltree(pathfile)
        
        print "清理目录:" + pathfile
        
        #修改属性,同linux下chmod
        win32api.SetFileAttributes(pathfile, win32con.FILE_ATTRIBUTE_NORMAL)
        #api删除空文件夹
        os.rmdir(pathfile)
      else:
        #不是的话递归到下一层
        clearsvn(pathfile)
        
        
def deltree(path):
  
  filenames = os.listdir(path)
  #遍历所有子目录和文件夹
  for singlefile in filenames:
    
    pathfile = path + '\\' + singlefile
    #如果是文件夹的话递归清理
    if os.path.isdir(pathfile):
      
      print "清理目录:" + pathfile
      #修改属性,同linux下chmod
      win32api.SetFileAttributes(pathfile, win32con.FILE_ATTRIBUTE_NORMAL)
      #递归到下一层
      deltree(pathfile)
      #api删除空文件夹
      os.rmdir(pathfile)
    #如果是文件的话则删除  
    if os.path.isfile(pathfile):
      
      print "删除文件:" + pathfile
      #修改属性,同linux下chmod
      win32api.SetFileAttributes(pathfile, win32con.FILE_ATTRIBUTE_NORMAL)
      #api删除文件
      os.remove(pathfile)

        
if __name__=="__main__":
  #提示用户输入目录路径
  pathin = raw_input("拖放要删除文件所在目录到此:")
  
  #清理字串首尾的引号
  path = trimpath(pathin)
  
  #确认文件夹
  choose = raw_input("需要清理的文件夹为 [ " + path + " ] y/n?:")
  
  if choose == 'y' or choose == 'Y':
    #检查用户输入的目录是否存在,如果不存在则退出程序
    if os.path.exists(path)==False:
      print "输入的目录不存在!"
      os._exit(1)

    #遍历子文件夹进行删除
    clearsvn(path)
    
    print "清理完成!"
    #运行结束暂停,显示友好信息
    os.system('pause')
  
   发表时间:2010-12-09   最后修改:2010-12-09
整得有点复杂化了,我经常用的:
# coding:gbk

import os
import shutil

svnroot = "."
targetdirs = []
for path, dirs, files in os.walk(svnroot):
    for ad in dirs:
        currdir = os.path.join(path, ad)
        if ad==".svn":
            print currdir
            targetdirs.append(currdir)

for cd in targetdirs:
    shutil.rmtree(cd)


粘到要清理的文件夹下运行就会把当前文件夹下所有“.svn”目录删除
0 请登录后投票
   发表时间:2010-12-10  
直接用svn的export功能,导出的文件无.svn目录。
这样更方便,也不必借助外部工具。

0 请登录后投票
   发表时间:2010-12-14  
find . -name .svn | xargs rm -rf
0 请登录后投票
   发表时间:2010-12-14  
liwenjun 写道
直接用svn的export功能,导出的文件无.svn目录。
这样更方便,也不必借助外部工具。



正解。SVN自带导出命令,是从本地导出到本地,而不是从svn服务器导出到本地
0 请登录后投票
   发表时间:2010-12-14  
虽然没有接触过svn一直在用git,删除目录底下所有.svn文件在windows下不是可以这样嘛
del /s /q *.svn
0 请登录后投票
   发表时间:2010-12-14  
oaklet 写道
整得有点复杂化了,我经常用的:
# coding:gbk

import os
import shutil

svnroot = "."
targetdirs = []
for path, dirs, files in os.walk(svnroot):
    for ad in dirs:
        currdir = os.path.join(path, ad)
        if ad==".svn":
            print currdir
            targetdirs.append(currdir)

for cd in targetdirs:
    shutil.rmtree(cd)


粘到要清理的文件夹下运行就会把当前文件夹下所有“.svn”目录删除


经测试,还是老问题,在删除时由于svn文件夹内文件属性为隐藏存档,删除出错

yadsun 写道
liwenjun 写道
直接用svn的export功能,导出的文件无.svn目录。
这样更方便,也不必借助外部工具。



正解。SVN自带导出命令,是从本地导出到本地,而不是从svn服务器导出到本地


又测试了几次,我汗。。。
以前导出都是习惯性查看版本库导出。。。然后所有的忽略文件都没被导出。。。
直接在文件夹上选导出导出的就是本地的文件啊,受教了。。。
0 请登录后投票
   发表时间:2010-12-14  
yadsun 写道
liwenjun 写道
直接用svn的export功能,导出的文件无.svn目录。
这样更方便,也不必借助外部工具。



正解。SVN自带导出命令,是从本地导出到本地,而不是从svn服务器导出到本地


又试了几次。。。导出一个2-8层目录的svn目录(常用的),内部N个文件夹,总大小在40M左右,导出了2分钟。。。
直接拖一个副本删除svn文件貌似快多了。。。

luciferdevil 写道
虽然没有接触过svn一直在用git,删除目录底下所有.svn文件在windows下不是可以这样嘛
del /s /q *.svn


svn的本地处理方式是在每个文件夹下建立.svn文件夹,内部存储的是同级目录下的文件备份和版本信息。
svn在网上查找常用的处理方式是一个注册表导入,添加鼠标右键菜单,用的也是cmd命令,我也在用,只是人较迷糊,误点一次差点郁闷死。。。其实写个bat更简单,但这不是想用python么
0 请登录后投票
   发表时间:2010-12-15  
@for /r .  %%I in (.svn) do if exist "%%I" rd/s/q "%%I"
0 请登录后投票
   发表时间:2010-12-16  
del /S */.svn

好像del命令就能删除了
0 请登录后投票
论坛首页 编程语言技术版

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