对于一些模糊(但有效)的原因,我需要找出文件是否已在我们的存储库中进行了版本化。
我只找到了一种获取包含目录的日志的迂回方式,然后解析它以删除条目:
svn log -v a/b/|grep " D .*a/b/c.xml"
它有效,但感觉“不干净”,有些脆弱。
答案 0 :(得分:4)
根据您的问题,您隐含地将您的请求限定为已删除的文件(因为如果没有删除它,可能会显示简单的目录搜索)。 Lazy Badger的评论是值得的:取消资格而不会失去任何准确性,从而简化命令。我全都赞成简化,但考虑到任何问题,我也想考虑以更少的额外费用从解决方案中获得更多。
从您提出的解决方案开始:
svn log -v a/b/ | grep " D .*a/b/c.xml"
我首先会添加-q
选项,这会减少你刚丢弃的输出:
svn log -v -q a/b/ | grep " D .*a/b/c.xml"
然后我想知道是否删除了这样的文件,而当被删除时(即在哪个修订版中)。由于您还隐式将您的环境限定为Unix / Linux,因此这是一个使用awk的解决方案(改编自此blog entry):
svn log -q -v a/b/ | awk '
/^r[0-9]* \|/ { REVISION=$1; }
/ D/ { print REVISION": "$0; }
' | grep " D .*a/b/c.xml"
这是因为使用svn log
参数时–v
输出的格式有效:它报告修订后跟该修订中的所有文件。这是一个示例,显示在修订版10506中删除了文件Page.cs:
r10506 | msorens | 2011-02-14 12:58:56 -0800 (Mon, 14 Feb 2011) | 1 line
Changed paths:
A /Projects/Test/Common
A /Projects/Test/Common/Setup.cs
A /Projects/Test/Common/Utility.cs
D /Projects/Test/Page.cs
上面的awk命令以这种格式解析输出,从顶行提取修订号,然后标记为删除的任何文件(“D”行)。对于Windows,PowerShell通过使用switch语句提供与awk相同的功能和易用性:
$( switch -Regex (svn log -q -v a/b) {
'^(r[0-9]*) \|' { $rev = $Matches[1] }
'^ D\s+(.*)' { "{0,-6} {1}" -f $rev, $Matches[1] }
} ) | Select-String "a/b/c.xml"
但TortoiseSVN有一种更简单的方法 - 只需打开工作副本根目录上的日志窗口,然后在搜索框中输入文件名。修订列表会立即按您键入的内容进行过滤。如果它显示多行输出,则最新(最顶层)修订将始终是删除文件的那一行。
答案 1 :(得分:0)
感谢@Michael Sorens的回答,我得到了这个工作
在我的情况下,我需要查看从文件夹中移除哪些文件 ./ assets / gfx
一旦你有了输入设置,这里就是单行代码中bash shell的代码,其中每一行都是一个命令行,并且' mysearchstr'是一个设置到shell中的var
mysearchstr=assets/gfx/
svn log -v $mysearchstr | awk '/^r[0-9]* \|/ { REVISION=$1; } / D/ { print REVISION": "$0; }' | grep menu
只想分享我如何组织这个解决方案。它是对原始答案的重复...但也许可以用于简洁的代码块,易于复制,并重申实际的解决方案答案(但有人实现它)实际上是正确的