如何查找svn回购中是否存在文件?

如何查找svn回购中是否存在文件?,svn,Svn,出于一些模糊(但有效)的原因,我需要找出是否在我们的存储库中对文件进行过版本控制 我只找到了一种迂回的方法来获取包含dir的日志,然后对其进行解析以查找删除的条目: svn log -v a/b/|grep " D .*a/b/c.xml" 它可以工作,但感觉“不干净”并且有些脆弱。基于您的问题,您隐含地限定了您对已删除文件的请求(因为可能如果不删除,简单的目录搜索就会发现它)。Lazy Badger的评论很有价值:在不损失任何准确性的情况下删除限制,从而简化命令。我都赞成简化,但考虑到任

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

我只找到了一种迂回的方法来获取包含dir的日志,然后对其进行解析以查找删除的条目:

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

它可以工作,但感觉“不干净”并且有些脆弱。

基于您的问题,您隐含地限定了您对已删除文件的请求(因为可能如果不删除,简单的目录搜索就会发现它)。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的解决方案(改编自此):

这是因为当使用
–v
参数时,
svn日志输出的格式是有效的:它报告一个修订,后面是该修订中的所有文件。以下示例显示文件Page.cs在版本10506中被删除:

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"

但是有一种更简单的方法可以使用OrtoiseSVN——只需打开工作副本根目录上的日志窗口,然后在搜索框中键入文件名。修订列表会立即按您键入的内容进行筛选。如果它显示多行输出,则最新(最上面的)版本将始终是删除文件的版本。

多亏了@Michael Sorens answer,我才得以工作

在我的例子中,我需要查看从文件夹中删除的文件。/assets/gfx

在输入设置完成后,这里是一行中bashshell的代码,其中每一行都是命令行,“mysearchstr”是shell中的一个变量集

mysearchstr=assets/gfx/
svn log -v $mysearchstr | awk '/^r[0-9]* \|/ { REVISION=$1; } /  D/ { print REVISION": "$0; }' | grep menu

我只是想分享一下我是如何组织这个解决方案的。这是原始答案的翻版。。但是,对于某些人来说,可能会使用简洁、易于复制的代码块,并重申实际的解决方案答案(无论有人如何实现)实际上是正确的

svn log-q-v | grep filename | wc-l
mysearchstr=assets/gfx/
svn log -v $mysearchstr | awk '/^r[0-9]* \|/ { REVISION=$1; } /  D/ { print REVISION": "$0; }' | grep menu