问题提出:同事误操作直接把几个分支全部checkout了,在windows客户端没法批量操作,因为数量太多导致卡死
解决思路:在p4服务器上用脚本执行revert操作
代码如下
#!/bin/bash
# $1是user,$2是workspace
p4 opened -u $1 | grep $2 | awk '{pos=index($0, "#"); print substr($0,0,pos-1)}' >revert_list_new.txt
awk -v work_space=$2 '{if(length($0) > 5){str = str" \""$0"\""}; if(length(str) > 850){ print "p4 revert -C "work_space""str >> "out_file_new.sh"; str=""}}' revert_list_new.txt
第一行是通过p4 opened命令查找出所有打开的文件,同时提取文件名,这里是以第一个#为截止符,比如“//depot/impforest_upgrate/client/cocos2d-x-3.7/build/cocos2d_js_tests.xcodeproj/xcshareddata/xcschemes/js-tests Mac.xcscheme#1 - edit default change (text) by designer@designer_6193”,这里注意文件名中可能有空格,提取的时候一定要准确,还可以这样,用awk的贪婪匹配
p4 opened -u $1 | grep $2 | awk '{if(match($0, "//depot.*?#")>0){print substr($0, RSTART, RLENGTH - 1)}}' >revert_list_new.txt
第二行是将找出的所有文件名,批量的放到revert命令中,注意,因为文件名可能有空格,所有要加上引号。同时revert命令的参数有1024个utf8字符限制,所以我这里初略得设置为大于850字符的话就切换另一个revert命令,或者是直接向p4 revert传递10个参数:
cat revert_list.txt | xargs -n10 p4 revert -C workspace
补充:
经过评论区blakeyi的启发,我今天尝试了下按目录来提交revert,效率更高,
p4 revert -C workspace //depot/target_dir/...
大家以后要是有类似需求,直接给最上层目录就可以,效率大大提升,可以省去大量的请求次数,这里感谢blakeyi给出的建议,正是从他的建议中得到的启发,刚开始的时候对p4不熟悉,所以办法还是笨了些,大家一看了之吧。