0

変更された単一のファイルをコミットしたい。http://wiki.svnkit.com/Committing_To_A_Repositoryによると、次のコードを使用します。

public static SVNCommitInfo modifyFile(ISVNEditor editor, String dirPath, String filePath, InputStream is, long size) throws SVNException {
    try {
       SVNDeltaGenerator deltaGenerator = new SVNDeltaGenerator(); 

        editor.openRoot(-1);
        editor.openDir(dirPath, -1);
        editor.openFile(filePath, -1);
        editor.applyTextDelta(filePath, null);

        String chksm = deltaGenerator.sendDelta(filePath, is, editor, true);

        editor.textDeltaEnd(filePath);
        editor.closeFile(filePath, chksm);                                    

        /*
         * Closes the directory.
         */
        editor.closeDir();
        /*
         * Closes the root directory.
         */
        editor.closeDir();
        return editor.closeEdit();
    } catch (SVNException e) {
        if (editor != null) {
            try {
                editor.abortEdit();
            } catch (Exception ex) {
            }
        }    
        throw e;
    }
}

しかし、残念ながら、外観を所有するユーザーによってコミットが行われているにもかかわらず、例外が発生します。

org.tmatesoft.svn.core.SVNException: svn: E175002: PUT of '/spielwiese/!svn/wrk/e9019037-4201-0010-b534-277444c0b279/postcommittesten.txt': 423 Locked (http://localhost:8081)
svn: E175002: PUT request failed on '/spielwiese/!svn/wrk/e9019037-4201-0010-b534-277444c0b279/postcommittesten.txt'
at org.tmatesoft.svn.core.internal.wc.SVNErrorManager.error(SVNErrorManager.java:106)
at org.tmatesoft.svn.core.internal.wc.SVNErrorManager.error(SVNErrorManager.java:90)
at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.request(HTTPConnection.java:739)
at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.request(HTTPConnection.java:369)
at org.tmatesoft.svn.core.internal.io.dav.DAVConnection.performHttpRequest(DAVConnection.java:728)
at org.tmatesoft.svn.core.internal.io.dav.DAVConnection.doPutDiff(DAVConnection.java:514)
at org.tmatesoft.svn.core.internal.io.dav.DAVCommitEditor.closeFile(DAVCommitEditor.java:335)

私は何を間違っていますか?正しい方法は?

SVNCommitClientを使用しようとしました。しかし、SVNCommitClient は、単一のファイルをコミットするためにローカル作業コピーを必要とし、ローカル作業コピーを作成したくありません。したがって、ファイルを特定の場所のリポジトリに直接コミットしたいと考えています。

現在のユーザーによってロックされているファイルをコミットするにはどうすればよいですか?

4

2 に答える 2

2

Subversion と DAV は、ロックされたファイルに変更を加えるために、ロックを所有するユーザーになるだけでは不十分です。また、そのファイルのロック トークンを所有している必要があります。その理由は、1 つのプログラムがロックを保持し、別のプログラムが同じユーザーによって実行されているファイルを変更する場合の問題を防ぐためです。通常、ロック トークンは、ロックが作成された作業コピーに格納され、コードはそこから取得します。ただし、作業コピーなしでファイルに変更をコミットしようとしているようです。

ISVNEditorロックされたファイルにコミットする場合は、提供したコードにないロック トークンを取得するときにロック トークンを提供する必要があります。あなたが提供したリンクのサンプルコードでは、クラスでgetCommitEditorメソッドを呼び出すことによって行われます。使用できるロック トークンを取得するの署名がSVNRepositoryいくつかあります。getCommitEditorMap

ロックトークンを取得するには、ロックを作成したときからそれらを保存する必要があります。ロック トークンを持っていない場合は、単純にロックを盗むことができる可能性があります。これを行うには、引数を True に設定してクラスでlockメソッドをSVNRepository呼び出しforceます (サーバーでロックを盗む権限があると仮定します)。getLockandgetLocksメソッドがありますが、SVNRepositoryその方法でロックトークンを取得できるかどうかは覚えていません。試してみる価値があるかもしれません。

于 2013-11-11T03:46:22.370 に答える
0

ありがとう@ベンReser。あなたはブルズアイを打ちました。SVNRepository#getCommitEditor(String, ISVNWorkspaceMediator) を使用しました。しかし、実際には、署名が間違っているメソッドです。

今、私のコードは読み取り、すべて正常に動作します:

// Discover lock on the file
SVNLock lockedItem = this.repository.getLock(fileUrl);
Map<String, String> locks = new HashMap<String, String>();
if (lockedItem != null) {
    locks.put(lockedItem.getPath(), lockedItem.getID());
}

// Retrieve a commiteditor and provide the lock tokens
ISVNEditor editor = this.repository.getCommitEditor(
    comment, locks, true, new WorkspaceMediator());
SVNCommitInfo commitInfo = SVNUtils.modifyFile(editor,
    dirUrl, fileUrl, fileReader, size);
于 2013-11-22T15:12:10.080 に答える