我的网站的代码使用这段代码在服务器(Ubuntu)上自动部署。
cmd = 'cd ' + checkout_dir + ' && ' + svn_command + " st | awk '{print $2}' | grep -v ^deploy | tac | xargs -r" + svn_command + " revert -R && " + svn_command + ' up -r ' + options.revision
这个命令的作用是cd
进入结账目录,运行svn status
,然后提取文件名($2
),删除deploy
目录及其列表中的所有文件(我不想恢复它)。如果没有参数,它不会运行 svn revert 命令,否则它会运行。
不幸的是xargs -r
不适用于我的机器(Mac OS X 10.8)。所以我被困在这里,有人可以帮忙吗?
事实上,BSD 实现xargs
没有-r
flag (--no-run-if-empty
)。 Linux 中的 GNU 版本有它。
以下是解决该问题的一种方法,该方法在 Linux 和 BSD 中都有效:
... | (grep -v ^deploy || echo :) | xargs svn revert
The grep ... || echo :
中间会生成一条带有:
在它的情况下输出grep
是空的。有点dirty, 因为xargs
仍然会运行命令svn revert :
。如果您的存储库不包含该文件:
那么这应该没有影响,所以可以接受。这:
可以是其他任何内容,只要您的存储库中没有此类文件即可。
最后,作为@三重 https://stackoverflow.com/users/874188/tripleee指出,grep ... || echo :
必须包含在(...)
, 因为:
the ||
优先级高于|
,从而终止(第一个)管道。
您的代码看起来像一个 Python 字符串。这样会更具可读性:
kwargs = {
'svn': svn_command,
'dir': checkout_dir,
'revno': options.revision,
}
cmd = "cd {dir} && {svn} st | awk -v r=1 '$2 ! ~ /deploy/ {{ print $2; r=0 }} END {{ r || print \":\" }}' | xargs {svn} revert && {svn} up -r {revno}".format(**kwargs)
我对你原来的内容做了一些修改:
- 移动了逻辑
grep
inside awk
, as @三重 https://stackoverflow.com/users/874188/tripleee建议。请注意,自从grep
不再需要 hack,也不再需要换行(...)
- 丢弃了
tac
,因为我不明白其中的意义
- 丢弃了
-R
from svn revert
,因为我认为你不需要它
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)