0

我在这里找到了解决我的问题的最佳方法:Howto fix subversion «!» 地位

但现在,我只想写一个小脚本来做到这一点。

像这样:

svn status | grep '\!' | awk '{print $2}' | xargs svn revert

svn status | grep '\!' | awk '{print $2}' | xargs svn delete

但在一条线上。

因为,在 svn revert 之后,"svn status | grep '!'" 没有返回任何结果。合理的。

我认为我找到了一个解决方案:将两次传递给 xargs 的数据放在一行中,但我的英语有点生疏,命令行不是我的强项。

4

2 回答 2

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

每个文件都将被还原和删除,但顺序是不可预测的。

于 2012-09-22T12:19:14.073 回答
1

这两个命令在一行中。请注意 xargs 的完全丢失。并不是说 xargs 不好,只是这里不需要它。

x="$(svn status | grep '\!' | awk '{print $2}')"; svn revert "$x" && svn delete "$x" || 回声“没有svn删除$?”

请注意,如果svn revert失败, svn delete将不会运行。“no svn delete”表示其中一个 svn 命令失败。

于 2012-09-22T15:09:16.417 回答