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

Mr *_*ark 6 svn

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

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

svn log -v a/b/|grep "   D .*a/b/c.xml"
Run Code Online (Sandbox Code Playgroud)

它有效,但感觉"不干净",有点脆弱.

Mic*_*ens 4

根据您的问题,您隐式地限定了对已删除文件的请求(因为大概如果未删除文件,简单的目录搜索就会显示它)。Lazy Badger 的评论很有价值:在不损失任何准确性的情况下删除限定条件,从而简化命令。我完全赞成简化,但考虑到任何问题,我也喜欢考虑以很少的额外成本从解决方案中获得更多。

\n\n

因此,从您提出的解决方案开始:

\n\n
svn log -v a/b/ | grep "   D .*a/b/c.xml"\n
Run Code Online (Sandbox Code Playgroud)\n\n

我首先添加该-q选项,该选项会减少您无论如何都要丢弃的输出:

\n\n
svn log -v -q a/b/ | grep "   D .*a/b/c.xml"\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后我不仅想知道是否删除了这样的文件,还想知道它是何时删除的(即在哪个版本中)。由于您还隐式地将环境限定为 Unix/Linux,因此这里有一个使用 awk 的解决方案(改编自此博客条目):

\n\n
svn log -q -v a/b/ | awk \'\n    /^r[0-9]* \\|/ { REVISION=$1; }\n    /  D/ { print REVISION": "$0; }\n\' | grep "   D .*a/b/c.xml"\n
Run Code Online (Sandbox Code Playgroud)\n\n

svn log这是有效的,因为使用该参数时的输出格式\xe2\x80\x93v:它报告一个修订版本,后跟该修订版本中的所有文件。Here\xe2\x80\x99s 是一个示例,显示文件 Page.cs 在修订版 10506 中被删除:

\n\n
r10506 | msorens | 2011-02-14 12:58:56 -0800 (Mon, 14 Feb 2011) | 1 line\nChanged paths:\n   A /Projects/Test/Common\n   A /Projects/Test/Common/Setup.cs\n   A /Projects/Test/Common/Utility.cs\n   D /Projects/Test/Page.cs\n
Run Code Online (Sandbox Code Playgroud)\n\n

上面的 awk 命令解析这种格式的输出,从顶行提取修订号,然后提取标记为已删除的任何文件(\xe2\x80\x9cD\xe2\x80\x9d 行)。对于 Windows,PowerShell 通过使用 switch 语句提供与 awk 相同的功能和易用性:

\n\n
$( switch -Regex (svn log -q -v a/b) {\n    \'^(r[0-9]*) \\|\' { $rev = $Matches[1] }\n    \'^   D\\s+(.*)\'  { "{0,-6} {1}" -f $rev, $Matches[1] }\n} ) | Select-String "a/b/c.xml"\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n