目录
一、SVN简介
SVN是一种开源的版本控制系统,它用于管理随着时间变化的数据,它会记录每个文件的更改历史。因此,我们可以将文件恢复到旧版本,或者浏览文件的变更历史记录。
在工作上,由于使用到svn的频率较为频繁,所以写了一个svn自动化脚本。
二、添加环境变量
一般在安装svn的时候,会默认不把svn添加到环境变量中。可以按下win+r,再输入cmd,打开命令行窗口,在里面输入"svn help",如果出现以下情况,就说明svn未被添加到环境变量中。
那么就需要手动把svn添加到环境变量中。
步骤一:在搜索栏中搜索“应用和功能”。
步骤二:打开之后,搜索“TortoiseSVN”,单击该应用,然后点击修改。
步骤三:点击“Next”
步骤四:点击“Modify”,再点击“Next”
步骤五:点击“Command line client tools”,再点击“Will be ins.talled on local hard drive”,然后点击“Next”
步骤六:点击“Install”
稍等一会儿,svn环境变量就安装完毕。
安装完后,再次按下win+r,输入“cmd”打开命令行窗口,输入“svn help”,出现如下界面就说明环境变量添加成功。
安装成功后,就可以编写svn自动化脚本代码。
三、SVN自动化代码
导入os模块,在安装Python环境的时候会自动安装该模块,所以直接导入即可。创建一个名为Svn的类,类中的魔法方法__init__根据实际情况添加代码。
3.1、svn update
svn update的作用是将我们本地的工作拷贝默认更新至svn中的最新版本(HEAD),当然也可以给定自己想要更新到的版本。
类方法update中定义了两个参数,一个是local_path,另一个是默认值command。
local_path表示本地的工作拷贝路径,这边用双引号包住路径,防止路径中带有空格导致编译报错。
command表示svn update的可选项,可以通过在命令行窗口中输入“svn help update”查看所有可选项。command默认是空(即默认更新至最新版本)。
如果想要更新至指定版本,则在调用类方法update时,改为command='-r xxxxx',例如“-r 1111”。
r表示revision。版本号的格式不局限于数字,也可以指定日期,例如“-r {2022-11-10}”。当然也可以是“-r HEAD”,这个就是更新至最新版本,如果你想要更新至最新版本,那么可以不去定义command。
变量cmd_update是个字符串,为了在字符串中插入变量值,所以在单引号前加上f。也可以选择用"+"进行连接。
最后通过os.system运行svn update命令。
import os
class Svn:
def __init__(self):
pass
def update(self, local_path, command=''):
"""
将本地路径默认更新至svn中的最新版本
"""
cmd_update = f'svn update {command} "{local_path}"'
os.system(cmd_update)
调用类方法update。需要注意的是复制的本地路径用的是反斜杠"\",可以用转义字符"\\"或是在字符串前加"r",或者将路径中的反斜杠"\"改成正斜杠"/"。
if __name__ == '__main__': #表示当前py文件为主程序 若被其他py文件调用 则不会进入该if的函数体中(便于进行调试)
tmp = Svn() #实例化
path = r'D:\folder\sub_folder' #反斜杠\
svn_command = '-r 1111' #
tmp.update(path, command=svn_command) #更新到指定版本1111
path = 'D:/folder/sub_folder' #正斜杠/
tmp.update(path) #默认更新到最新版本
3.2、svn revert
svn revert的作用就是撤销对本地工作拷贝所作的修改。但是一旦revert了,是没有办法恢复对本地的修改的。
定义方法与svn update相同。
同样可以通过在命令行窗口中输入"svn help revert"查看revert命令的可选项。
command='--depth=infinity'表示撤销当前本地路径下所有文件和文件夹所作的修改
def revert(self, local_path, command=''):
cmd_revert = f'svn revert {command} "{local_path}"'
os.system(cmd_revert)
调用类方法revert。
if __name__ == '__main__': #表示当前py文件为主程序 若被其他py文件调用 则不会进入该if的函数体中(便于进行调试)
tmp = Svn() #实例化
path = r'D:/folder/sub_folder/tmp.txt' #单个文件
tmp.revert(path) #撤销对于单个文件的修改
path = 'D:/folder/sub_folder' #当前目录
svn_command = '--depth=infinity' #
tmp.revert(path, command=svn_command) #撤销当前路径下所有文件和文件夹的改动
3.3、svn checkout
svn checkout的作用是将svn上的文件夹中所有内容复制到本地路径中,使得本地的文件和svn上的文件相互联系。
注意:直接将svn上的文件拖至本地,那么本地的文件和svn是没有任何联系的,这样就无法对本地文件执行任何svn命令(revert,update...)。
类方法新添加了一个参数svn_path,这个是指svn上文件夹路径。
def checkout(self, svn_path, local_path, command=''):
cmd_checkout = f'svn checkout {command} "{svn_path}" "{local_path}"'
os.system(cmd_checkout)
调用类方法checkout。
在checkout时,会将svn中的subfolder下的所有文件或文件夹被拷贝至本地中,并且如果本地路径不存在,那么执行checkout的过程中会自动新建文件夹。
if __name__ == '__main__': #表示当前py文件为主程序 若被其他py文件调用 则不会进入该if的函数体中(便于进行调试)
tmp = Svn() #实例化
svn_path = 'svn://111.11.11.111/project/folder/subfolder' #svn上的路径
local_path = r'D:/folder/sub_folder' #本地路径
tmp.checkout(svn_path, local_path) #将svn路径下的文件复制到本地
暂时就先记录这么多吧,写不动啦。下期文章会继续分享我用到过的svn命令,例如add, changelist, log, commit等等。
声明:
文章会在优快云,知乎,b站上传~
文章只为记录下写svn自动化脚本过程中遇到的问题,命令行当中的可选项也并不是每个都用过,文章中只是列举了我自己使用过的可选项。如果对上述代码有改进建议或是编译有误无法实现功能的话,欢迎大家在评论区提出~