1

これが私の問題です:

私は卒業論文の一環としてプロジェクトに取り組んでいます。さまざまなオープン ソース プロジェクト リポジトリに接続して、ソース ファイルから情報を取得しようとしています。実際に、このプロジェクトのコードと、その間に加えられた変更を分析します。つまり、ソフトウェアがどのように進化するかを確認し、加えられた変更を特定したいと考えています。したがって、SVNKit を使用してリポジトリに接続し、変更された各リビジョンの各ソース ファイルの内容をダウンロードする必要があります。

たとえば、初期ディレクトリ構造を持つプロジェクトがあるとします。

  • dirA/

    -- file1.java

    -- file2.java

最初のコミットでは dirA/file1.java が変更され、2 回目のコミットでは dirA/file2.java と file1.java が変更されます。初期状態の 2 つのファイル (file1.java と file2.java) のコードを分析し、次に 1 回目と 2 回目のコミット中に file1.java で行われた変更と、2 回目のコミット中に file2.java で行われた変更を分析します。

3 番目のコミットでは、ディレクトリとファイルが作成されます。

  • dirB/

    -- file3.java

  • dirA/dirC

    -- file4.java

上記と同様に、dirB/file3.java と dirA/dirC/file4.java のコードを分析し、(メイン) ディレクトリ構造がどのように変更されたかを分析します。

4 番目のコミットは、file3.java ファイルを dirA/dirC/ ディレクトリにコピーし、このファイルに変更を加えます。同様に、コピー操作によってディレクトリ構造がどのように変化したかを分析し、コミット前後の file3.java の内容を分析します。

私たちはコード指向であるため、リポジトリからすべてのソース ファイルとそのすべてのリビジョンを取得したいと考えています。特定のファイルの各リビジョンについて、現在のリビジョン (最初のリビジョンから開始) と、最後のリビジョンまでの前のリビジョンの内容が必要です。コミットごとにファイルを変更する必要がないため (コピーまたは削除される可能性があります)、同じ内容の複製ファイルをダウンロードする必要はありません。

ファイルの内容に対して後方差分を再帰的に実行することにより、ファイルの内容を最後のリビジョンにすることによってのみ、ファイルの元の状態を取得する方法があることを私は知っています。たとえば、最後のリビジョン (2 回目のコミット時に作成されたもの) の dirA/file1.java の内容を取得し、差分出力を取得すると、このリビジョンの前 (2 回目のコミット前) のファイルの状態を取得できます。この方法では、リビジョンごとに各ファイルの内容をダウンロードする必要はありません。したがって、最初のリビジョンでファイルの内容をダウンロードし、次に各リビジョンのすべての差分出力 (存在する場合) をダウンロードし、前方差分を実行してコミット後の状態を取得するだけです。

説明 :

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 のログを取得すると、変更ごとに 1 つずつ、合計 3 つのエントリが作成されます (リビジョン 1、2、3 に対応)。ソース ファイルに対してコミット (変更) が行われるたびにコードの変更を分析するため、3 つのリビジョンすべてについてファイルの内容を取得する必要があります。SVNRepository.getFile(...) という簡単な方法でそれを行う方法を知っています。このアプローチの問題点は、1000 回変更された 1 つのファイルがある場合、その内容を 1000 回ダウンロードする必要があることです (毎回異なるリビジョン番号に対して)。つまり、100 個のソース ファイルと各ファイルごとに約 1000 個の変更を含む小さなプロジェクトの場合、100,000 個の異なるコンテンツを取得する必要があります!!! もう 1 つの方法は、最後のリビジョンのファイルの内容と、それ以前の各リビジョンのファイルの内容を取得して、差分出力を取得することです。以前のすべてのリビジョンのファイルの内容を取得するために、diff 出力を (逆方向に) 適用することができます。つまり、帯域幅を最小限に抑えます。これは私が探している解決策です。または、より良い解決策がある場合は、喜んで貢献してください。

SVNKit でそのような機能を実装する方法について、私に助けてください。いくつかの短いコード例を提供し、どのクラスとメソッドを使用する必要があるかを提供していただければ、非常に役に立ちます。そうすれば、Java ドキュメントを読むことができます。すべての助けに感謝します。

よろしくお願いします、エルヴィス。

4

1 に答える 1

0

ログ/リビジョン履歴を実行します。プロジェクトの最初から開始し、各コミットで変更されたファイルを確認します。ファイルの変更/追加/削除/コピー/移動 (これはコミット情報で確認できます) を確認したら、そのリビジョンのファイルの内容をダウンロードし、次にそのファイルの変更を確認したときのために覚えておいてください。次に、変更ごとにファイルの内容のみを取得します。

SVNキットの例/チュートリアルを見ましたか?

于 2011-09-17T23:08:19.560 に答える