这是我的问题:
我正在研究一个项目,作为我的毕业论文的一部分。我正在尝试连接到不同的开源项目存储库并从源文件中获取信息。实际上,我们会分析这些项目的代码以及在此期间对其进行的更改。换句话说,我们希望了解软件如何发展并指定所做的更改。因此,我们需要使用SVNKit连接到存储库,并为每个源文件下载其更改的每个修订版的内容。
例如,假设我们有一个具有初始目录结构的项目:
dirA /
- file1.java
- file2.java
第一次提交对dirA / file1.java进行更改,第二次提交对dirA / file2.java和file1.java进行更改。我们想要分析初始状态下两个文件(file1.java和file2.java)的代码,然后分析在第一次和第二次提交期间在file1.java上进行的更改以及在第二次提交期间在file2.java上进行的更改。
第三次提交创建目录和文件:
dirB /
- file3.java
dirA / dirC
- file4.java
以与上述相同的方式,我们想要分析dirB / file3.java和dirA / dirC / file4.java的代码,以及我们想要分析(主)目录结构的更改方式。
第4次提交将文件file3.java复制到dirA / dirC /目录并对该文件进行更改。同样地,我们想要分析复制操作如何在提交之前和之后更改目录结构并分析file3.java的内容。
因为我们是面向代码的,所以我们希望从存储库及其所有修订中获取所有源文件。对于特定文件的每个版本,我们需要当前版本的内容(从第一次修订开始)和前一版本,直到最后一次修订。由于在每次提交时都不需要更改文件(可能会复制或删除),因此无需下载具有相同内容的重复文件。
我知道有一种方法可以检索文件的原始状态,只需将其内容放在最后一个版本中,方法是递归地对其内容执行向后差异。例如,在最后一个版本中具有dirA / file1.java的内容(在第二次提交期间创建的那个)并且具有diff输出,我们可以检索该修订之前的文件状态(在第二次提交之前)。这样就无需为每个修订下载每个文件的内容。因此,我们只需要在第一个版本下载文件的内容,然后每个版本的每个diff输出(如果有的话),并执行forward 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个不同的内容!另一种方法是获取最后一个版本的文件内容以及每个先前版本以获取diff输出。我们可以应用diff输出(向后)来检索所有先前版本的文件内容。也就是说,我们最小化带宽。 这是我正在寻找的解决方案,或者如果有更好的解决方案,您很乐意为此做出贡献。
您能否就如何使用SVNKit实现此类功能向我提供一些帮助。如果你提供一些简短的代码示例,或者我必须使用哪些类和方法,那将非常有用,所以我可以阅读java doc。每一个帮助都将得到欣赏。
提前谢谢你, 猫王。
答案 0 :(得分:0)
运行日志/修订历史记录。从项目开始处开始,查看每次提交中的修改文件。当您看到文件更改/添加/删除/复制/移动(您可以在提交信息中看到这一点)时,请下载该修订的文件内容,并在下次看到该文件更改时记住它。然后你只在每次更改时都获得了文件内容。
您是否看过SVN套件示例/教程?