SVN
和 Git
两个常用的版本管理工具都有 add
和 commit
命令,但是这两个命令的含义是不同的,git add
命令添加的是变化的文件,不管是增加的文件、删除的文件还是更新的文件,使用 git add
命令之后都可以放到暂存区,而 svn add
命令只能影响新增和变化的文件,对原在库中现已删除的文件没有影响,想要真正删除文件需要在执行 svn commit
命令之前先执行 svn delete
命令。
SVN
删除文件需要指定文件名字,而使用在一些自动化脚本中时,被删除的文件都是其他脚本自动删除的,要想获得这些文件的名字,可以利用 svn st
命令来查询,然后搭配管道再使用 svn del
命令来删除这些文件。
$ svn st
! test/A.txt
! test/B.txt
! test/C Blank.txt
! test/DD.txt
M test/E.txt
? test/F.txt
A test/G.txt
svn st
命令的结果对每个变化文件显示一行,第一列是文件状态,第二列及后面的部分是文件名
!
:表示已经删除的文件M
:表示文件内容发生变化的文件?
:表示一个新文件,不在原版本库中A
:表示本次新增的文件要想删除文件只需要把 !
开头的文件删除就可以了,常规命令如下:
svn st | grep ^! | awk '{print " --force "$2}' | xargs -r svn del
这个命令就是要生成 svn del --force test/A.txt
命令然后执行,这样就能达到删除文件的目的了
基于这个目的,一般自动化部署的机器上的svn提交命令如下:
svn st | grep ^! | awk '{print " --force "$2}' | xargs -r svn del
svn add . --no-ignore --force
svn commit -m "build message"
上述命令能处理绝大部分的情况,但是如果被删除的文件中包含空格,那么执行命令时就会报错:
$ svn st | grep ^! | awk '{print " --force "$2}' | xargs -r svn del
svn: E125001: 'test/C' does not exist
为什么会报错的呢?就是说因为文件 test/C Blank.txt
的名字中包含了空格,使用 awk '{print " --force "$2}'
把空格后半部分的文件名丢掉了,所以只要处理一下这种情况就可以了,处理命令如下:
svn st | grep ^! | awk '{$1="";print $0 }' | awk '$1=$1' | awk '{print " --force ""\""$0"\""}' | xargs -r svn del
svn st
显示个文件状态grep ^!
过滤出原在版本库中但现已删除的文件awk '{$1="";print $0 }'
去掉每行信息中第一列的状态值awk '$1=$1'
去掉数据开头和结尾的空格awk '{print " --force ""\""$0"\""}'
拼接文件名,并在前后添加引号,--force "test/C Blank.txt"
xargs -r svn del
利用管道传递文件名将文件删除svn st
命令可以查询 SVN
当前目录下各个文件的状态svn del
命令用于删除原版本库中的文件svn st | grep ^! | awk '{$1="";print $0}' | awk '$1=$1' | awk '{print " --force ""\""$0"\""}' | xargs -r svn del
互发声明并非只是打打嘴架,应该是在相互试探着对方的底线,各自盘算着多方的利益,双方也都是极其聪明的人,背后都有强大的团队提供支持,博弈啊博弈,每一方都会选择对自己最有利的行动~