在svn移动后找到旧文件的新位置

时间:2013-03-01 15:34:35

标签: svn tortoisesvn visualsvn

有没有办法让一个已知的目录或文件.....从较旧的版本....然后(知道它已被“移动”以后)找到它被移动的位置?

实施例

https:\\myserver.com\Repository1\OldFolderStructure\Folder01\FolderA\MyFile01.txt

(此结构/文件存在于修订版333)

........

svn mkdir "https:\\myserver.com\Repository1\NewFolderStructure\"

svn move "https:\\myserver.com\Repository1\OldFolderStructure\Folder01" "https:\\myserver.com\Repository1\NewFolderStructure" 

svn ls "https:\\myserver.com\Repository1\NewFolderStructure\Folder01" 

.......... (现在假装有1000多个其他签到,但没有更多的svn动作),所以我跳到修订版1444.) ..........

现在,如果我查看版本333,我有这个文件“MyFile01.txt”(或文件夹“FolderA”)。 而我正试图找出它在HEAD修订版中的位置。

你可能在想,“为什么他需要这个?” 我希望我没有。但是我需要30分钟才能给你修改历史记录。 (<<糟糕的笑话)。

......... EDIT ..............

还有一些额外的东西。

一:svn info从来没有给我足够的信息来找到新家。主要原因是嵌套目录。 我svn移动一些文件夹,但该文件夹有几个嵌套在1级以上的子文件夹。

然而,使用svn diff,虽然我得到了很多信息(在修订版1444和333之间)......信息就在那里。我的意思是,svn diff任务需要33秒,但是一旦它返回,我在xml中有信息,我正在解析它并将它放在一些简单的DTO对象中。

两个(相同的文件名发布):

如果我的项目的原始位置是:

https://mySvnServer.com/Repo1/SoccerClubWebSite/scripts/validationRoutines.js

然后我做一个svn diff(详细),我在HEAD修订版中有以下两个项目:

<path props="none" kind="file" item="add">https://mySvnServer.com/Repo1/WebSites/SoccerClubWebSite/scripts/validationRoutines.js</path>
<path props="none" kind="file" item="add">https://mySvnServer.com/Repo1/WebSites/CriticalBusinessAppWebSite/scripts/validationRoutines.js</path>

我遇到了一些文件名不唯一的地方。

所以我不得不写一个Uri Segment Matcher试图找到匹配.....通过向后工作Uri。

实施例。 在上面的两个项目中....我首先尝试URI的最后一段。

validationRoutines.js

我在该字符串上有2个匹配项。因此,我不知道我关心的确切问题。 我抓住了父文件夹并使用它。

scripts/validationRoutines.js

仍然是两场比赛。

现在我添加第三个uri段(从右到左工作)

SoccerClubWebSite/scripts/validationRoutines.js

现在我发现了一场独特的比赛。

所以我现在所做的基本模板是:

(1) svn diff 333:HEAD

(fyi,这给了很多信息)。

(2) 解析xml并将其推送到简单的DTO对象。

(3) 在该xml中查找“add”或“modified”的项目,并使用基于上面列出的段逻辑的匹配系统。

(3b)因为同一个文件可能被多次修改(因此多次出现在xml中(但是使用相同的头部svn-path)...我不得不做一个GROUP BY(svn- LINQ小组在这里运作良好。

我还需要针对更多示例测试我的逻辑。但是你,这不是微不足道的。

2 个答案:

答案 0 :(得分:1)

您通常使用TortoiseSVN日志查看器。执行以下步骤:

  • 在您确定文件位于或现在位于的目录中打开。在最坏的情况下,从根开始(如示例所示)。
  • 键入文件名的搜索框部分,并记住,这是一个正则表达式。因此,要搜索MyFile01.txt,请键入MyFile01\.txt(在.之前使用反斜杠,以确保将该点视为字符,而不是任何字符。)
  • 日志查看器现在列出与文件有关的所有修订。您现在应该立即看到文件的移动,文件名本身以红色突出显示。移动本身在对话框中显示为deleteadd相结合(Subversion没有移动状态)。

我已经用文件readme.txt做了一个例子,这个结果对话框(在创建和移动文件之后)看起来像这样:

enter image description here

如您所见,突出显示的文本(红色)显示所选版本的已删除文件(最后一行)和添加的文件(第二行),这是TortoiseSVN显示移动的方式。

有关详细信息,请参阅文档中的Filtering Log Messages

使用svn log命令可以实现类似的功能(请参阅documentation为您提供第一部分:

  • 按日期和目录过滤
  • 第二个(通过日志消息或文件名中的匹配过滤)您必须通过例如在Unix / Linux / MacOS X中的grep命令。这取决于你的操作系统(Windows?)和你的shell技能。

答案 1 :(得分:1)

对于CLI来说,它更多的是手工(或gawk + ​​grep + ...或解析XML)

关于CLI的一些迭代。

关于hello.txt的故事,它出生在树干中,关于他在树枝上的生活与图片和评论

svn log http://mayorat.ursinecorner.ru:8088/svn/Hello/branches/i18n/ -v --stop-on-copy -q
------------------------------------------------------------------------
r25 | lazybadger | 2010-09-14 20:59:35 +0600 (Вт, 14 сен 2010)
Changed paths:
   D /branches/i18n/Beaujour.txt
   A /branches/i18n/Buongiornor.txt (from /branches/i18n/Beaujour.txt:24)
   A /branches/i18n/Goededag.txt (from /branches/i18n/GuterTag.txt:24)
   D /branches/i18n/GuterTag.txt
------------------------------------------------------------------------
r23 | lazybadger | 2010-07-17 06:05:00 +0600 (Сб, 17 июл 2010)
Changed paths:
   A /branches/i18n/Beaujour.txt (from /branches/i18n/Hello.fr.txt:22)
   A /branches/i18n/GuterTag.txt (from /branches/i18n/Hello.de.txt:20)
   D /branches/i18n/Hello.de.txt
   D /branches/i18n/Hello.en.txt
   D /branches/i18n/Hello.fr.txt
   A /branches/i18n/Hello.txt (from /branches/i18n/Hello.en.txt:20)
------------------------------------------------------------------------
r20 | lazybadger | 2010-07-17 05:23:59 +0600 (Сб, 17 июл 2010)
Changed paths:
   A /branches/i18n/Hello.en.txt (from /branches/i18n/Hello.txt:19)
   D /branches/i18n/Hello.txt
------------------------------------------------------------------------
r19 | lazybadger | 2010-07-17 05:22:16 +0600 (Сб, 17 июл 2010)
Changed paths:
   A /branches/i18n/Hello.de.txt
   A /branches/i18n/Hello.fr.txt
------------------------------------------------------------------------
r18 | lazybadger | 2010-07-17 05:11:40 +0600 (Сб, 17 июл 2010)
Changed paths:
   A /branches/i18n (from /trunk:17)
------------------------------------------------------------------------

r18 - /trunk/hello.txt现在必须标识为/branches/i18n/hello.txt(在检测到来自/ trunk的更改路径字符串中)

r20 - 根据“from /branches/i18n/Hello.txt”文件名为/branches/i18n/Hello.en.txt

r23 - 根据“from /branches/i18n/Hello.en.txt”文件名返回/branches/i18n/Hello.txt

<强> XML版本

>svn log http://mayorat.ursinecorner.ru:8088/svn/Hello/branches/i18n/ -v -q --xml -r 18 -r 20 -r 23
<?xml version="1.0" encoding="UTF-8"?>
<log>
<logentry
   revision="18">
<author>lazybadger</author>
<date>2010-07-16T23:11:40.388125Z</date>
<paths>
<path
   action="A"
   prop-mods="true"
   text-mods="false"
   kind="dir"
   copyfrom-path="/trunk"
   copyfrom-rev="17">/branches/i18n</path>
</paths>
</logentry>
<logentry
   revision="20">
<author>lazybadger</author>
<date>2010-07-16T23:23:59.075625Z</date>
<paths>
<path
   prop-mods="false"
   text-mods="false"
   kind="file"
   action="D">/branches/i18n/Hello.txt</path>
<path
   prop-mods="false"
   text-mods="false"
   kind="file"
   copyfrom-path="/branches/i18n/Hello.txt"
   copyfrom-rev="19"
   action="A">/branches/i18n/Hello.en.txt</path>
</paths>
</logentry>
<logentry
   revision="23">
<author>lazybadger</author>
<date>2010-07-17T00:05:00.997500Z</date>
<paths>
<path
   prop-mods="true"
   text-mods="false"
   kind="file"
   copyfrom-path="/branches/i18n/Hello.fr.txt"
   copyfrom-rev="22"
   action="A">/branches/i18n/Beaujour.txt</path>
<path
   prop-mods="false"
   text-mods="false"
   kind="file"
   copyfrom-path="/branches/i18n/Hello.de.txt"
   copyfrom-rev="20"
   action="A">/branches/i18n/GuterTag.txt</path>
<path
   prop-mods="false"
   text-mods="false"
   kind="file"
   copyfrom-path="/branches/i18n/Hello.en.txt"
   copyfrom-rev="20"
   action="A">/branches/i18n/Hello.txt</path>
<path
   prop-mods="false"
   text-mods="false"
   kind="file"
   action="D">/branches/i18n/Hello.en.txt</path>
<path
   prop-mods="false"
   text-mods="false"
   kind="file"
   action="D">/branches/i18n/Hello.fr.txt</path>
<path
   prop-mods="false"
   text-mods="false"
   kind="file"
   action="D">/branches/i18n/Hello.de.txt</path>
</paths>
</logentry>
</log>

在路径节点中检查copyfrom-path的文件名或目录,并在同一节点action="A"参数内查找新文件名。对于优秀的XML树解析器来说,这不是一件大事,但我更喜欢纯文本和眼睛