1

这是我的问题:

作为毕业论文的一部分,我正在研究一个项目。我正在尝试连接到不同的开源项目存储库并从源文件中获取信息。实际上,我们分析了这个项目的代码以及在此期间对其所做的更改。换句话说,我们想看看软件是如何发展的并指定所做的更改。因此,我们需要使用 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 输出,我们可以检索在此修订之前(第二次提交之前)的文件状态。这样就不需要为每个修订下载每个文件的内容。因此,我们只需要在第一个修订版处下载文件的内容,然后为每个修订版下载每个 diff 输出(如果有),并执行前向 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 文档。每一个帮助将不胜感激。

提前谢谢你,猫王。

4

1 回答 1

0

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

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

于 2011-09-17T23:08:19.560 回答