我在这里找到了解决问题的最佳方案:Howto fix subversion «!» status
但现在,我只想写一个小脚本来做到这一点。
像这样:
svn status | grep '\!' | awk '{print $2}' | xargs svn revert
svn status | grep '\!' | awk '{print $2}' | xargs svn delete
但是在一条线上。
因为,在svn revert之后,“svn status | grep'!'”没有返回任何结果。理性。
我认为我找到了一个解决方案:Putting the data passed to xargs twice in one line但是我的英语很少生气,命令行不是我强大的技能。
答案 0 :(得分:1)
svn status | grep '\!' | awk '{print $2}' | tee list.$$ | xargs svn revert
xargs svn delete < list.$$
rm list.$$
tee
命令就像是T管道配件;输出的一个副本将转到每个命名文件,另一个副本转到标准输出。在这里,我只命名了一个文件。这会强制所有恢复在任何删除之前发生。名称list.$$
是一种保护脚本免于践踏其他进程文件的简单方法;像mktemp
这样的程序可用于创建更安全,更不可预测的名称。 OTOH,如果你没有在恶劣的环境中奔跑,那不太重要。如果你非常小心,你将创建一个trap
以确保文件被清理:
tmp=${TMPDIR:-/tmp}/list.$$
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15
svn status | grep '\!' | awk '{print $2}' | tee $tmp | xargs svn revert
xargs svn delete < $tmp
rm $tmp
trap 0
可以尝试其他技巧,但至少其中一些技巧不能保证顺序操作。例如,bash
中的流程替换:
svn status | grep '\!' | awk '{print $2}' | tee >(xargs svn revert) | xargs svn delete
每个文件都将被还原和删除,但排序是不可预测的。
答案 1 :(得分:1)
一行中的两个命令。注意xargs的完全丢失。并不是说xargs并不精彩,这里就不需要了。
x="$(svn status | grep '\!' | awk '{print $2}')"; svn revert "$x" && svn delete "$x" || echo "no svn delete $?"
请注意,如果 svn revert 失败, svn delete 将无法运行。 “no svn delete”表示其中一个svn命令失败。