我经常会一次往Subversion里添加一批文件。在使用命令行做这件事时,你必须指定所有想要添加的文件名。如果文件不多的话这还不算太糟糕,但如果你要添加20个文件,那就费事了。当然你也可以用通配符,但这样一来就可能匹配到已经在版本控制之下的文件(这不会有什么损害,只不过会输出一堆错误信息,可能会跟别的错误信息混淆)。为了解决这个问题,我写了一行简单的bash命令:
svn st | grep '^\?' | tr '^\?' ' ' | sed 's/[ ]*//' | sed 's/[ ]/\\ /g' | xargs svn add
表4.3详细解释了这一行命令。
我大概花了15分钟写出这条命令,然后用了它成百上千次。
****************************************************
这个自动化过程已经很完美了,一个“简单”的shell脚本,这是一个权威编写并使用了百上千次的脚本。
然后我在一个博客中看到这样一个脚本:
svn st|awk '{print $2}'|xargs svn add。
乍看之下觉得更加精炼,仔细看下就会发现这个脚本没有区分文件状态。所以完善了以下这个脚本:
- svn st | awk '{if ( $1 == "?") { print $2}}' | xargs svn add
这样,以后我可能使用这个脚本成百上千次。(当然这个脚本也没有考虑过滤掉不要添加的文件)
当你第三次做一件事情的时候,就应该考虑将其工具化,自动化!
如果使用svn的命令行,例如在linux下的终端中使用, www.2cto.comsvn的添加命令是svn add,删除命令是svn del,但是缺乏批量的操作,如果我在资源管理器中,手动添加了好多个文件夹下的各种各样的文件,然后我想一次性add,svn就力不从心了,即使使用svn add *,也会因为新添文件的父目录已经被添加进版本库而忽略父目录下的所有文件。手动删除了很多文件,想要一次性del时,也会遇到类似的情况。通过研究,发现以下的命令能够解决这两个问题:批量删除文件——svn status|grep ! |awk '{print $2}'|xargs svn del语句释义是:首先svn status查看svn状态,列出所有改动,打!号的是已经删除的文件但是还未标记成从库中除去,grep !将这些文件单独抽离出来,此时如果不执行后面的语句,呈现的内容应该是类似! img/p/2-49-small.jpg! img/p/2-48-thickbox.jpg! img/p/2-48-medium.jpgwww.2cto.com再用awk '{print $2}'将抽离出来的文本结果处理,留下每一行的第二段文字,即后面的文件名,此处必须注意,svn status|grep !和后面的语句|awk '{print $2}'|xargs svn del之间,必须有一个空格,否则终端还是会认为这个!号是特殊符号此时呈现的结果应该是img/p/2-49-small.jpgimg/p/2-48-thickbox.jpgimg/p/2-48-medium.jpg这个时候就可以直接递交给svn del命令了,使用xargs这个参数构造命令,将每一行的文本作为参数提供给svn del,结果就是所有列出的文件都执行了一遍del了。批量添加文件——几乎一样,不同的是svn标记的符号不一养,使用的是问号!svn status|grep ? |awk '{print $2}'|xargs svn add