目录
上一期文章中讲过了如何安装svn环境变量以及自动化脚本中的三个命令update,revert,checkout,如果有不知道怎么安装svn环境变量的朋友可以看下上期文章。
《Python-SVN自动化脚本(一):update,revert,checkout》
https://blog.csdn.net/qq_51479469/article/details/131490289?spm=1001.2014.3001.5501
这期讲一下svn自动化脚本的其他几个命令:add,commit,changelist,export,mkdir。
一、commit
commit的作用是将本地修改过后的文件上传至svn上。注意:commit只能上传本地上和svn有链接关系的文件。
例如下图中,1.txt,2.txt和svn有关联,所以文件图标上会有相应的图案,而3.txt是在本地新建的文件,所以和svn并没有任何关联。当修改了2.txt的内容时,此时本地的2.txt就和svn上的2.txt内容不一致,所以图标就会变成红色的感叹号。1.txt的内容本地和svn保持一致,所以是绿勾。
当使用脚本命令中的commit时,只能够上传改动后的2.txt,而3.txt是不会上传的。如果想要上传3.txt的话,我们需要先使用svn add命令(见第二节)。
![](https://i-blog.csdnimg.cn/blog_migrate/a30d408733c3536cec252eeb8b9f5842.png)
接下来是代码部分,首先还是新建一个类,再创建一个类方法commit。
变量local_path为被修改的文件的本地路径。
执行svn commit时,必须添加-m选项用于添加comment,如果没有填写comment,则svn commit会报错。
变量command为commit命令的其他可选项。文第六章会讲述如何查看命令的可选项。
import os
class Svn:
def __init__(self):
pass
def commit(self, local_path, comment='fill comment', command=''):
cmd_commit = f'svn commit -m "{comment}" {command} "{local_path}"'
os.system(cmd_commit)
调用类方法commit。
例子中如果想要将2.txt的改动上传至svn,那么给出2.txt所在的本地目录即可,上传时注意填写comment。
if __name__ == '__main__': #表示当前py文件为主程序 若被其他py文件调用 则不会进入该if的函数体中(便于进行调试)
tmp = Svn() #实例化
path = r'D:\example' #可以将\改为/,这样就不需要字符串前加r了
comment = 'Modify content of 2.txt' #上传文件的改动至svn时需要填写comment
tmp.commit(path, comment=comment) #调用类方法commit
二、add
在第一节中有提到过如果只是在本地目录上新建了一个文件,那么在执行commit时,是不会将该新文件一起上传到svn的。那么如果想要上传本地新建的文件,就需要用到svn add。
svn add的作用就是将本地文件和svn之间建立关联,但注意svn add仅仅只是使得文件和svn之间有关联,并不是上传。下图中若想将3.txt也上传到svn上,先对3.txt执行svn add,再执行svn commit命令。
注意:要确保文件夹example和svn有关联!!!!只有这样,3.txt才能上传到和本地路径D:\example相关联的svn路径下。
创建类方法add。
local_path为本地路径。
command为svn add的其他可选项。
def add(self, local_path, command=''):
cmd_add = f'svn add {command} "{local_path}"'
os.system(cmd_add)
调用类方法add。
如果想要将本地新建的文件夹也上传到svn上,也是给出本地路径即可。但是要注意的是svn add默认是将本地新建的文件夹中的所有内容(包括该新建文件夹本身)与svn之间建立关联。
在本地新建的文件和svn有关联之后,在调用类方法commit,就可以将本地新建的文件上传至svn。
if __name__ == '__main__': #表示当前py文件为主程序 若被其他py文件调用 则不会进入该if的函数体中(便于进行调试)
tmp = Svn() #实例化
path = r'D:\example\3.txt' #可以将\改为/,这样就不需要字符串前加r了
comment = 'commit file 3.txt' #执行svn commit需要填写comment
tmp.add(path) #将文件和svn之间建立链接
tmp.commit(path, comment=comment) #上传该文件至svn
path = r'D:\example\folder_A' #可以将\改为/,这样就不需要字符串前加r了
comment = 'commit new folder to svn' #执行svn commit需要填写comment
tmp.add(path) #将文件夹以及文件夹中的内容和svn之间建立链接
tmp.commit(path, comment=comment) #上传该文件夹以及文件夹中全部内容至svn
三、changelist
如果说不想将本地所修改的文件全部上传到svn上,只是想将其中一部分文件上传到svn上,就可以使用svn changelist命令。changelist的作用就是将需要上传的文件存储在一个集合里面,当执行svn commit的时候,直接调用changelist选项,这样就可以往svn上上传我们想要上传的文件。
代码如下:
local_path:文件的路径
command: changelist命令的可选项
my-changelist是集合的名字,就是说将需要上传的文件存到一个名为my-changelist的集合里面。集合的名字可以随意取,不一定要取my-changelist。
def changelist(self, local_path, command=''):
cmd_changelist = f'svn changelist my-changelist {command} "{local_path}"'
os.system(cmd_changelist)
调用changelist类方法:
如下图中,example文件夹中的folder_1、folder_2、1.txt、2.txt都被作了修改,那么如果只想上传folder_1里的文件以及1.txt,那么实参file_path就记下二者的路径,并用双引号裹住路径,中间用空格分离,然后调用类方法changelist,这样,folder_1和1.txt就会被存到my-changelist的集合中。
![](https://i-blog.csdnimg.cn/blog_migrate/ca09cc61da2a481314718c057d3ee78b.png)
执行完类方法后,如何上传my-changelist中存储的文件涅?这就要用到svn commit命令的一个可选项changelist,当然可选项changelist和changelist命令并不是一样的。格式为:
svn commit -m "commit file" D;/example changelist ChangeListName(例子中ChangeListName为my-changelist)
代码中commit_command = 'changelist my-changelist'就表示执行svn commit时,只上传my-changelist里存储的文件。此处还要注意的是,folder_1里的所有文件都会被上传至svn,如果不想这么做的话,那就继续细分文件路径,D:/example/folder_1/.../...
调用类方法commit,就能够上传D:/example目录下想要上传的文件或文件夹了。
还有一点要注意的是请保证file_path是在local_path目录下的。
例如:local_path='D:/example',但是file_path='D:/tmp/1.txt',这样是不行的。
if __name__ == '__main__': #表示当前py文件为主程序 若被其他py文件调用 则不会进入该if的函数体中(便于进行调试)
tmp = Svn() #实例化
file_path = '“D:/example/folder_1” ”D:/example/1.txt“' #本地目录下想要上传的文件
tmp.changelist(file_path) #执行svn changelist命令
local_path = 'D:/example' #本地目录
commit_command = 'changelist my-changelist' #svn commit的可选项changelist(和上面的changelist不一样)
tmp.commit(local_path, command=commit_command) #执行svn commit
四、export
svn export的作用是将svn上的文件直接拖到本地,好比鼠标选中svn服务器中的文件,直接拖到本地路径上。这样的做法是无法使得被拖拽到本地的文件和svn有关联的。比如直接把svn上的1.txt拖到本地,那么本地的1.txt和svn上的1.txt没有任何关联。
svn_path是文件在svn上的路径
local_path是文件被放在哪个本地路径下
def export(self, svn_path, local_path, command=''):
cmd_export = f'svn export {command} "{svn_path}" "{local_path}"'
os.system(cmd_export)
调用export类方法:
这里加了一个svn export的可选项“--force”,相当于强制将文件从svn上拖到本地。可以先将这个可选项注释,如果编译报错,再加回去。
执行svn export之后,就会发现svn上的1.txt被复制到了本地路径D:/example下,要记住的是本地的1.txt和svn的1.txt没有任何关联。
if __name__ == '__main__': #表示当前py文件为主程序 若被其他py文件调用 则不会进入该if的函数体中(便于进行调试)
tmp = Svn() #实例化
svn_path = 'svn://111.11.11.111/folder/1.txt' #文件所在svn路径
local_path = 'D:/example' #文件要导出的本地路径
export_command = '--force' #强制导出
tmp.export(svn_path, local_path, command=export_command) #执行svn export
五、mkdir
svn mkdir的作用就是在svn上新建文件夹。这个命令蛮简单的,不过调用这个命令的时候一定要填写comment,否则新建文件夹会失败,所以选项-m必不可少。
def mkdir(self, svn_path, comment='Please fill comment', command=''):
cmd_mkdir = f'svn mkdir -m "{comment}" {command} "{svn_path}"'
os.system(cmd_mkdir)
调用类方法mkdir:
比如想要在svn路径svn://111.11.11.111/folder下新建一个名为subfolder的文件夹,那么变量svn_path直接给出subfolder的路径即可。
mkdir_comment为执行svn mkdir命令时,需要填写的comment。
最后调用类方法mkdir,就能够在svn://111.11.11.111/folder下新建一个文件夹subfolder了。
if __name__ == '__main__': #表示当前py文件为主程序 若被其他py文件调用 则不会进入该if的函数体中(便于进行调试)
tmp = Svn() #实例化
svn_path = 'svn://111.11.11.111/folder/subfolder' #新建的文件夹所在svn路径
mkdir_comment = 'create folder called subfolder' #填写comment
tmp.mkdir(svn_path, comment=mkdir_comment) #执行svn mkdir
六、查看每个svn命令的可选项
同时按下win + r,输入"cmd",打开命令行窗口,输入svn help command(command可以是update, revert等等),然后回车,就能看见每个svn命令的可选项了。
如果想知道svn有多少种command的话,在命令行窗口输入"svn help"就行了。
声明:
文章在CSDN、b站、知乎同步上传~
文章只为记录下写svn自动化脚本过程中遇到的问题,命令行当中的可选项也并不是每个都用过,文章中只是列举了我自己使用过的可选项。如果对上述代码有改进建议或是编译有误无法实现功能的话,欢迎大家在评论区提出~