0

アプリケーションは、SVN リポジトリへのコミット中に複数のユーザーをサポートする必要があるように設計する必要があります。私はアプリケーションと関連するものを使い果たしましたが、このマルチユーザーのことで立ち往生しています。どうすればこれを達成できますか? スレッドごとに個別の SVNRepository ドライバーをインスタンス化する必要があることをどこかで見ました。これは、スレッドセーフではないことを示しています..または、全体が間違っている可能性があります。この問題に関するヘルプをいただければ幸いです。ありがとう。

Hereから上記の情報 (イタリック体の情報) を取得します。

4

1 に答える 1

2

私は SVNKit の開発者です。物事がどのように機能するかを説明させてください。

SVNRepository クラスは、独自の資格情報を持つ 1 つの SVN 接続を表します。これはスレッドセーフではなく、シーケンシャル操作しか実行できないことを意味します。詳細については、次の記事を参照してください。

http://vcs.atspace.co.uk/2012/09/21/are-svnkit-methods-reenterable/

したがって、アプリケーションが同時に複数のコミットを作成しようとする場合は、複数の独立した SVNRepository インスタンスを使用する必要があります。幸いなことに、特別な同期コードは必要ありません。すべての同期はサーバー側で実行されます。もう 1 つの良いニュースは、特定の SVNRepository オブジェクトのコミットが終了またはキャンセルされたときに、接続を再利用して別のコミットを開始できることです。ただし、http プロトコルを使用する場合、接続の資格情報を変更しても (SVNRepository#setAuthenticationManager)、同じ接続を再利用して別のユーザーに代わってコミットすることはできないことに注意してください。

作業コピーなしでコミットを作成するには、コミット トランザクションを開始する SVNRepository#getCommitEditor を使用します。トランザクションを停止するには、ISVNCommitEditor#closeEdit または ISVNCommitEditor#abortEdit を使用します。commit トランザクションが完了するまで、SVNRepository インスタンスで他の操作を実行できます。

ISVNCommitEditor インスタンスは、仮想作業コピーを記述する必要があります。これは、最新の作業コピーの状態に関する現在の知識を SVNKit に伝えます。説明が実際の最新の変更に対応していない場合は、「ファイルまたはディレクトリが古くなっています。更新してみてください」というエラーが表示されます。

http://vcs.atspace.co.uk/2012/07/20/subversion-remote-api-committing-without-working-copy/

ISVNEditor#openFile/openDir で実際のリビジョンの代わりに -1 を使用してチェックを無効にすることができますが、別の問題が発生する可能性があります: 変更を知らないうちに上書きしてしまう可能性があります。

別のオプションは、実際の作業コピーとファイルシステム上の実際の変更を使用してコミットすることです (SvnOperationFactory#createCommit を使用)。ただし、この場合でも、最初のリンクを見て、スレッド間で再利用できる/できないオブジェクトを確認してください。

他に質問がある場合は、SVNKit メーリング リストでお気軽にお問い合わせください。

于 2013-04-09T17:26:07.503 に答える