管道颠覆修订号到差异

时间:2012-01-25 22:14:43

标签: svn shell command-line cygwin

好的,所以我可以运行这样的命令来获取在特定日期或日期范围内制作的修订号列表:

svn log -q -r{2012-01-25}:HEAD | grep '^r[0-9]' | cut -d\| -f1 | cut -b2-

这很好用,给我一个这样的列表

12345
12346
12347

现在,我想将这些修订号传递给diff命令,因此在修订号上手动运行一个简单的svn diff会按预期运行,即

svn diff -c12345

但是,如果我尝试将修订列表传递给diff命令,就像这样

svn log -q -r{2012-01-25}:HEAD | grep '^r[0-9]' | cut -d\| -f1 | cut -b2- | xargs svn diff -c

它返回一个错误,找不到该节点 - 看起来像我传递的参数错误。

2 个答案:

答案 0 :(得分:0)

看起来,在管道的最后部分,xargs正在尝试执行:

svn diff -c 12345 12346 12347

应该尝试:

svn diff -c 12345
svn diff -c 12346
svn diff -c 12347

因为-c选项只接受一个参数。

要解决此问题,请尝试将xargs替换为xargs -n1

答案 1 :(得分:0)

问题是123451234612347中的每一个都作为单独的参数传递;你需要它与-c一起加入一个参数。

假设您使用的是xargs的GNU findutils版本,则可以使用-I选项。不使用svn的示例:

$ printf "12345\n12346\n12347\n" | xargs -n 1 -I{} echo svn diff -c{}
svn diff -c12345
svn diff -c12346
svn diff -c12347

请注意,这会为每个版本号调用svn diff一次。您的命令会使用多个版本号调用svn一次。如果要为多个版本号调用一次svn:

svn diff -c12345 12346 12347

然后需要一个不同的解决方案。

编辑:

阅读其他答案和svn文档,看起来您可以在-c之后留出空格,因此svn diff -c12345svn diff -c 12345有效。在这种情况下,只需使用-n 1即可。