我有一个曾经在SVN下的项目,但现在我将它移到Mercurial,所以我想清除所有.svn文件。
手动执行它有点太大了,所以我决定编写一个python脚本来完成它。但它没有用。
def cleandir(dir_path):
print "Cleaning %s\n" % dir_path
toDelete = []
files = os.listdir(dir_path)
for filedir in files:
print "considering %s" % filedir
# continue
if filedir == '.' or filedir == '..':
print "skipping %s" % filedir
continue
path = dir_path + os.sep + filedir
if os.path.isdir(path):
cleandir(path)
else:
print "not dir: %s" % path
if 'svn' in filedir:
toDelete.append(path)
print "Files to be deleted:"
for candidate in toDelete:
print candidate
print "Delete all? [y|n]"
choice = raw_input()
if choice == 'y':
for filedir in toDelete:
if os.path.isdir(filedir):
os.rmdir(filedir)
else:
os.unlink(filedir)
exit()
if __name__ == "__main__":
cleandir(dir)
印刷声明显示它只是“考虑”名称以“。”开头的档案馆。但是,如果我取消注释continue
声明,则会“考虑”所有归档。这是为什么?
或者是否存在一些已经存在的递归de-SVN-ify目录树的其他实用程序?
答案 0 :(得分:4)
至少你不应该重新发明轮子以进行递归目录遍历,只需使用os.walk
。
答案 1 :(得分:2)
这不能回答你的Python问题,但有一种更简单的方法可以做你想做的事情:svn export
会把你的文件树写成一些没有所有.svn目录的新文件。
答案 2 :(得分:1)
'continue'的原因显示正在考虑的所有文件夹是因为在函数末尾调用了exit()。在搜索到第一个目录后,对exit()的调用将退出Python。如果将其更改为“return”,则将递归调用函数。
os.listdir也不会返回'。'或'..'所以你不需要支票或任何继续陈述。
: - )
戴维
答案 3 :(得分:0)
我有一个曾经在SVN下的项目,但现在我将它移到Mercurial,所以我想清除所有的.svn文件。
不要在这里提出你的问题(我知道它已被正确回答)但是如果你想从Mercurial导出你的源代码,你应该使用SVN的'export
'命令... 。您不需要手动(或实际)删除所有.svn文件夹....
(这主要是针对其他人发布的这篇文章,看看如何做到这一点)
此外,Mercurial进口商还有SVN ....