如何找到一行代码被移动的文件的哪个版本?

时间:2013-07-22 03:35:25

标签: svn tortoisesvn visualsvn-server

我正在使用VisualSVN Server和TortoiseSVN,而我正在尝试查找特定行的多个修订版中显示特定行的位置。

我正在尝试查看过去的修订版save(12);出现在哪里,以及与我的工作副本相比,它在哪些版本中移动了。

r1和我的工作副本之间的统一差异仅显示初始位置。我试过单独查看差异,但有数百个版本。

有没有办法做到这一点?

3 个答案:

答案 0 :(得分:0)

如果您在文件的当前版本上运行TortoiseSVN blame工具,您应该会看到该行已成为现在的版本(以及由谁完成)。

答案 1 :(得分:0)

这可以手动完成,也可以使用脚本自动完成,并分阶段运行,但你会惊讶地发现:

  1. 写一个grep命令,如果该行在一个位置失败则通过另一个 - 例如 grep -n 该行的文字 filename.ext | grep CurrentLineNo
  2. 假设您有1000个可能的修订版本,则应该在0
  3. 处通过1000次失败
  4. 将一个文件更新为rev 500并再次运行 - 如果它通过了你就失败了你在任何一种情况下,你使用我们差异的前一半,并继续做同样的,即250,125,62, 31,15,7,4,2,1 - 在这个过程结束时 - (二进制搜索) - 你将有两个相邻的文件1版本通过1失败 - 只需10个步骤1000个修订20个百万

答案 2 :(得分:0)

<强>前言

  • “首次出现字符串”的差异首先出现在差异输出中的“+ string”
  • “在其中移动的修改”在diff(假设,新行超出diff-context / 3行作为默认/旧行)出现“ - string”和“+ string”in相同的差异

不是随时可用的代码,但是草稿想法很糟糕

Pure Subversion方式

这种方式(至少)有两种方法:从上到下探索历史,从下到上用log + diff

Blame-method 1)svn blame FILE > BLAMED-FILE,2)在BLAMED-FILE字符串中找到“save(12)”,注意字符串编号(任意方式)和最后修改版本(第一列)REV 3)回到历史svn blame -r REV FILE > BLAMED-FILE

重复步骤2-3,同时a)更改字符串数“save(12)”将不会显示“Movement revision”(它在前一行,而不是当前)b)文件中的REV将等于当前 - 它出现了“save(12)”的修订版

Log + diff-method 1)svn log -q -v FILE(获取修订列表,以任何形式影响FILE)2)对于列表中的每个修订,从最旧到最新修订方向执行svn diff -c REV | grep save(12) > FILE-REV 3)查找修订,与前言中的第二个注释相关,检查FILE-REV

Mercurial + hgsubversion方式

测试当地材料。我想在文件

中看到“Region = -MA”行的历史记录
>hg grep --all -n Region Charter.ini
Charter.ini:599:28:+:Region=-NE
Charter.ini:598:23:-:Region=
Charter.ini:598:26:-:Region=-MA
Charter.ini:598:24:+:Region=-MA
Charter.ini:597:13:+:Region=-MI
Charter.ini:597:16:+:Region=-GA
Charter.ini:597:19:+:Region=-CA
Charter.ini:597:23:+:Region=
Charter.ini:597:26:+:Region=-MA

一个命令回答“Region=-MA字符串出现在字符串26中的修订版597(SVN编号为598,+ 1)中。在修订版598中,字符串被移动到字符串24”,差异确认它。

597(已添加文件)

>hg diff -c 597 Charter.ini
diff -r 7e3dfc891358 -r 25efa70e5350 Charter.ini
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/Charter.ini       Tue Dec 29 08:27:48 2009 +0000
...
+Region=-MA
+75.130.96.0-75.130.111.255

598

>hg diff -c 598 Charter.ini
diff -r 25efa70e5350 -r 5665435f74b4 Charter.ini
--- a/Charter.ini       Tue Dec 29 08:27:48 2009 +0000
+++ b/Charter.ini       Tue Dec 29 13:09:58 2009 +0000
...
-//CHARTER-NET-5BLK
 66.188.0.0-66.191.255.255
+71.80.0.0-71.95.255.255
+75.128.0.0-75.143.255.255   
...
-
-//NETBLK-CHARTER-NET
-Region=
-75.128.0.0-75.143.255.255
+71.84.32.0-71.84.63.255

 Region=-MA
 75.130.96.0-75.130.111.255

为什么我使用substring而不是full-string?只是因为在完整字符串的情况下我得到了奇怪和意想不到的结果(与之前的grep相比)

>hg grep --all -n Region=-MA Charter.ini
Charter.ini:597:26:+:Region=-MA