如何找到svn-repo中是否存在过某个文件?

时间:2012-03-05 09:31:13

标签: svn

对于一些模糊(但有效)的原因,我需要找出文件是否已在我们的存储库中进行了版本化。

我只找到了一种获取包含目录的日志的迂回方式,然后解析它以删除条目:

svn log -v a/b/|grep "   D .*a/b/c.xml"

它有效,但感觉“不干净”,有些脆弱。

2 个答案:

答案 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

只想分享我如何组织这个解决方案。它是对原始答案的重复...但也许可以用于简洁的代码块,易于复制,并重申实际的解决方案答案(但有人实现它)实际上是正确的