Python-SVN自动化脚本(二):add,commit,changelist,export,mkdir

目录

一、commit

二、add

三、changelist

四、export

五、mkdir

六、查看每个svn命令的可选项


上一期文章中讲过了如何安装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命令(见第二节)。

由于用的不是公司电脑,所以文件图标只能自己画一下意思意思

 

接下来是代码部分,首先还是新建一个类,再创建一个类方法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的集合中。

3.txt为本地新建的文件,所以和svn没有关联,执行svn commit并不会上传该文件

执行完类方法后,如何上传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自动化脚本过程中遇到的问题,命令行当中的可选项也并不是每个都用过,文章中只是列举了我自己使用过的可选项。如果对上述代码有改进建议或是编译有误无法实现功能的话,欢迎大家在评论区提出~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值