【问题标题】:Downloading all files in each resivision from a SVN repo using SVNkit - Please HELP使用 SVNkit 从 SVN 存储库下载每个版本中的所有文件 - 请帮助
【发布时间】:2011-09-17 22:26:57
【问题描述】:

这是我的问题:

作为毕业论文的一部分,我正在研究一个项目。我正在尝试连接到不同的开源项目存储库并从源文件中获取信息。实际上,我们分析了这个项目的代码以及在此期间对其所做的更改。换句话说,我们想看看软件是如何发展的并指定所做的更改。因此,我们需要使用 SVNKit 连接到存储库,并为每个源文件下载它的内容,以便每个修订版本更改。

例如,假设我们有一个具有初始目录结构的项目:

  • 目录/

    --file1.java

    --file2.java

第一次提交更改 dirA/file1.java,第二次提交更改 dirA/file2.java 和 file1.java。我们要分析初始状态下两个文件(file1.java 和 file2.java)的代码,然后分析在第一次和第二次提交期间在 file1.java 上所做的更改以及在第二次提交期间在 file2.java 上所做的更改。

第三次提交创建目录和文件:

  • 目录/

    --file3.java

  • 目录/目录

    --file4.java

和上面描述的一样,我们要分析dirB/file3.java和dirA/dirC/file4.java的代码,以及我们要分析(主)目录结构是如何变化的。

第 4 次提交将文件 file3.java 复制到 dirA/dirC/ 目录并对此文件进行更改。同理我们要分析复制操作是如何改变目录结构的,分析提交前后file3.java的内容。

因为我们是面向代码的,所以我们希望从存储库中获取所有源文件及其所有修订版。对于特定文件的每个修订版,我们想要当前修订版(从第一个修订版开始)和前一个修订版的内容,直到最后一个修订版。因为不需要在每次提交时更改文件(可能会被复制或删除),所以无需下载具有相同内容的重复文件。

我知道有一种方法可以检索文件的原始状态,方法是通过递归地对其内容执行向后差异,使其内容处于其最后修订版。例如,在最后一次修订(在第二次提交期间创建的那个)具有 dirA/file1.java 的内容并具有 diff 输出,我们可以检索在此修订之前(第二次提交之前)的文件状态。这样就不需要为每个修订下载每个文件的内容。所以我们只需要在第一个修订版下载文件的内容,然后为每个修订版下载每个差异输出(如果有的话),并执行前向差异来检索提交后的状态。

解释:

1 - 在修订版 1 file1.java 中包含以下内容:

"Content at revision 1 (initial state)"

2 - 在修订版 2 中,此文件已修改为,并具有以下内容:

"Content at revision 1 (initial state)
 Modification at revision 2 (line added)"

3 - 在修订版 3 中,此文件已修改为并具有以下内容:

"Modification at revision 2 (line added)
 Modification at revision 3 (line added)
 First line from revision 1 was removed"

如果我们获得 file1.java 的日志,我们将有三个条目,每个修改一个条目(对应于 rev 1、2、3)。对于所有三个修订,我们都想检索文件内容,因为每次对源文件进行提交(更改)时,我们都会分析代码修改。 我们知道如何以一种简单的方式做到这一点:SVNRepository.getFile(...)。这种方法的问题是,如果我们有 1 个已修改 1000 次的文件,我们必须下载其内容 1000 次(每次使用不同的版本号)。也就是说,对于一个有 100 个源文件和每个文件大约 1000 次修改的小项目,我们应该得到 100,000 个不同的内容!!!另一种方法是获取最后一个修订版的文件内容,并为每个先前的修订版获取差异输出。比我们可以应用差异输出(向后)来检索所有先前版本的文件内容。也就是说,我们最小化带宽。 这是我正在寻找的解决方案,或者如果有更好的解决方案您很乐意贡献。

您能否就如何使用 SVNKit 实现此类功能提供一些帮助。如果您提供一些简短的代码示例,或者我必须使用哪些类和方法,这将非常有用,这样我就可以阅读 java 文档。每一个帮助将不胜感激。

提前谢谢你, 猫王。

【问题讨论】:

    标签: java svn svnkit


    【解决方案1】:

    运行日志/修订历史记录。从项目的开头开始,查看每次提交中修改过的文件。当您看到文件更改/添加/删除/复制/移动(您可以在提交信息中看到)时,下载该修订的文件内容,并在下次看到该文件更改时记住它。然后你只得到每次更改时的文件内容。

    您看过 SVN 套件示例/教程吗?

    【讨论】:

    • 感谢您的重播。我已经看过那些例子了。而且我知道如何获取特定版本的文件内容(SVNRepository.getFile(...))。我的问题非常具体:假设我们有一个版本为 100000 的文件,它自 0 版本以来就存在。我们想要的是为每个修改它的版本获取这个文件的内容。如上例所述:我们希望 file1.java 的内容(见上文)在第一次提交之前,第一次提交之后的内容,以及第二次提交之后的内容。
    • 这就是您运行日志/修订历史记录的原因。从项目的开头开始,查看每次提交中修改过的文件。当您看到文件更改时,请下载该修订的内容,并在下次看到该文件更改时记住它。然后你只得到每次更改时的文件内容。
    • 丹尼尔再次感谢您的回复,很抱歉为时已晚。我有一些问题:
    • 丹尼尔再次感谢您的回复,很抱歉为时已晚。我有一些问题:1)“在项目开始时”是什么意思?您是指创建项目的第一个修订版吗?如果是这样,我怎样才能找到该修订版? 2)如何发现文件更改?是通过查看日志条目的路径类型(在这种情况下为 SVNLogEntryPath.TYPE_MODIFIED)吗? (继续...)
    • 3) 如果我的项目有 1000 个源文件并且每个文件被修改大约 100 次怎么办。在这种情况下,我必须调用 100.000 SVNRepository.getFile(...) 这不是很有效。我知道另一种通过每次仅获取差异增量来最小化带宽的解决方案,但问题仍然存在,应该有 100.000 次调用。是否还有其他方法,例如 List getDeltasForRevisionRange(String path, long startR, long endR)。如果有这样的方法,那么只会调用 1000 次。
    猜你喜欢
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多