1

有没有办法从旧版本中获得一个已知的目录或文件......然后(知道它已经被“移动”在以后的时间)找出它被移动的位置?

例子。

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" 

..........(现在假设有 1,000 多个其他签到,但没有更多的 svn 移动),所以我跳转到修订版 1444。) ..........

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

你可能会想,“他为什么需要这个?” 我希望我没有。但是我需要 30 分钟才能给你那个修订历史。(<< 坏笑话)。

.........编辑..............

所以一些额外的东西。

一: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。

例子。在上述 2 项中......我首先尝试了 URI 的最后一段。

validationRoutines.js

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

scripts/validationRoutines.js

还是两场比赛。

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

SoccerClubWebSite/scripts/validationRoutines.js

现在我找到了一个独特的匹配。

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

(1) svn 差异 333:HEAD

(仅供参考,这会返回很多信息)。

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

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

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

我仍然需要根据更多示例来测试我的逻辑。但是YOUCH,这不是微不足道的。

4

2 回答 2

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 - 根据“来自/branches/i18n/Hello.txt”文件名是/branches/i18n/Hello.en.txt

r23 - 根据“从/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-tree 解析器来说不是一件大事,但我更喜欢纯文本和眼睛

于 2013-03-04T05:11:49.793 回答
1

你通常做的是使用 TortoiseSVN 日志查看器。执行以下步骤:

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

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

在此处输入图像描述

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

有关详细信息,请参阅文档中的过滤日志消息

svn log使用命令也有类似的可能(请参阅文档为您提供的第一部分:

  • 按日期和目录过滤
  • 第二个(通过日志消息或文件名中的匹配过滤)你必须通过例如grepUnix / Linux / MacOS X中的命令来获得。所以这取决于你的操作系统(Windows?)和你对shell的技能。
于 2013-03-01T17:33:46.323 回答