Svn 管道subversion版本号至diff

Svn 管道subversion版本号至diff,svn,shell,command-line,cygwin,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 svn log -q -r{2012-01-25}:HEAD | grep '^r[0-9]' | cut -d\| -f1 | cut -b2- | xargs svn diff -c 现在,我想将这些修订号传

好的,我可以运行这样的命令来获取某个日期或日期范围内的修订号列表:

svn log -q -r{2012-01-25}:HEAD | grep '^r[0-9]' | cut -d\| -f1 | cut -b2-
这很好,给了我一个这样的列表

12345
12346
12347
svn log -q -r{2012-01-25}:HEAD | grep '^r[0-9]' | cut -d\| -f1 | cut -b2- | xargs svn diff -c
现在,我想将这些修订号传递给diff命令,因此在修订号上手动运行一个简单的svn diff可以像预期的那样工作

svn diff -c12345
但是,如果我尝试像这样将修订列表管道化到diff命令

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

它返回一个未找到节点的错误-在我看来,参数传递错误。

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

svn diff -c 12345 12346 12347
应在何时尝试:

svn diff -c 12345
svn diff -c 12346
svn diff -c 12347
因为
-c
选项只接受一个参数


要解决此问题,请尝试将
xargs
替换为
xargs-n1
问题是
12345
12346
12347
中的每一个都作为单独的参数传递;您需要将它与
-c
合并到一个参数中

假设您使用的是GNU findutils版本的
xargs
,则可以使用
-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-c12345
svn diff-c12345
都是有效的。在这种情况下,只需使用
-n1
就可以了