SVN:通过比较文件或文件内容来确定修订版的方式

SVN: Way to determine revision by comparing file or file content

我有一个场景,我有一个文件,我需要知道这个文件的源版本是什么。

我可能对某个特定文件进行了数百次修订,并且有一个文件与这些修订中的一个或多个相匹配。 在 Tortoise、Cornerstone 或命令行中有什么方法可以做到这一点吗?

如果问题不是很清楚,我们深表歉意。老实说,我不确定如何表达我正在寻找的内容。

我在这里发现了一个关于 git 的类似问题;

GIT: determine revision based on a file

如果您必须在 VCS 之外使用 任何内容 并确定相应的版本并且不要将此数据添加到文件(文本文件)或存储库(二进制文件) - 它是 你的失败(Git-男孩必须受苦受难,因为他们没有直接关键词/但有污迹|干净的过滤器/和修订属性 /?/,但在 SVN 中你有这些可能性)。重新考虑您的工作流程并开始使用 Power!

在您当前的状态下(没有关键字,没有元数据)您可以(对于每个文件)

  • 计算任何可用的未版本化文件的哈希值
  • 为 repo 中的所有相关修订计算此文件的相同哈希值
  • 比较哈希值并找到匹配项

抄袭 this answer,这里有一个快速但肮脏的批处理文件可以完成这项工作,假设输入文件已经在版本控制之下。

@echo off

set file=%1
set temp_file="temp.file"

if [%file%] == [] (
  echo Usage: "%0 <file>"
  exit /b
)

for /F "tokens=1 delims=-r " %%R in ('"svn log -q %file%"') do (
  svn cat -r %%R %file% > %temp_file%
  fc %temp_file% %file% > nul
  if errorlevel 0 if not errorlevel 1 echo Matches revision r%%R
  del /Q %temp_file%
)

这会获取给定文件名的日志,并对每个修订执行以下操作:

  • 将该版本的文件转储到磁盘上的临时文件
  • 将转储的修订与输入文件进行比较
  • 如果它们相等,fcerrorlevel 设置为 0,因此检查并输出 Matches revision r###
  • 删除临时文件