对于一些模糊(但有效)的原因,我需要找出文件是否已在我们的存储库中进行了版本控制.
我只找到了一种获取包含目录的日志的迂回方式,然后解析它以删除条目:
svn log -v a/b/|grep " D .*a/b/c.xml"
Run Code Online (Sandbox Code Playgroud)
它有效,但感觉"不干净",有点脆弱.
根据您的问题,您隐式地限定了对已删除文件的请求(因为大概如果未删除文件,简单的目录搜索就会显示它)。Lazy Badger 的评论很有价值:在不损失任何准确性的情况下删除限定条件,从而简化命令。我完全赞成简化,但考虑到任何问题,我也喜欢考虑以很少的额外成本从解决方案中获得更多。
\n\n因此,从您提出的解决方案开始:
\n\nsvn log -v a/b/ | grep " D .*a/b/c.xml"\n
Run Code Online (Sandbox Code Playgroud)\n\n我首先添加该-q
选项,该选项会减少您无论如何都要丢弃的输出:
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\nsvn 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\nsvn log
这是有效的,因为使用该参数时的输出格式\xe2\x80\x93v
:它报告一个修订版本,后跟该修订版本中的所有文件。Here\xe2\x80\x99s 是一个示例,显示文件 Page.cs 在修订版 10506 中被删除:
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