Java SVNKit为何将文件夹添加至错误路径?
问题原因与解决方案
这个问题的核心是你误解了SVNKit中ISVNEditor的路径操作逻辑——它的所有路径操作都是基于当前打开的上下文节点的,而且对于已存在的父目录,必须先显式打开它切换上下文,才能在其下创建新内容,不能直接用嵌套路径跳过打开步骤。
为什么你的代码会出错?
当你调用svnEditor.openRoot(-1)后,当前操作上下文是dirA(你的SVNRepository指向的根节点)。此时直接调用addDir("dirB/dirC", null, -1),SVNKit会把这个路径解析为「在当前上下文(dirA)下创建节点」,但因为dirB已经存在,你不能用addDir处理已存在的节点,SVNEditor也不会自动帮你打开dirB切换上下文,最终就出现了dirC被错误创建在dirA下的情况。
修正后的代码示例
ISVNEditor svnEditor = svnRepository.getCommitEditor("add folder and file.", null); svnEditor.openRoot(-1); // 1. 打开已存在的dirB节点,切换操作上下文到dirB svnEditor.openDir("dirB", null, -1); // 2. 在dirB下添加dirC(路径相对于当前上下文dirB,直接写"dirC"即可) svnEditor.addDir("dirC", null, -1); // 3. 在dirC下添加file1.txt(路径相对于当前上下文dirC) svnEditor.addFile("file1.txt", null, -1); svnEditor.applyTextDelta("file1.txt", null); SVNDeltaGenerator deltaGenerator = new SVNDeltaGenerator(); String checksum = deltaGenerator.sendDelta("file1.txt", new ByteArrayInputStream(data), svnEditor, true); svnEditor.closeFile("file1.txt", checksum); // 按打开的逆序关闭节点:先关闭dirC,再关闭dirB,最后关闭根节点 svnEditor.closeDir(); // 关闭dirC svnEditor.closeDir(); // 关闭dirB svnEditor.closeDir(); // 关闭根节点 svnEditor.closeEdit();
关键逻辑说明
- 上下文切换:
ISVNEditor的所有路径都是相对当前打开节点的。openRoot后上下文是dirA,openDir("dirB")后上下文切换到dirB,后续操作的路径都基于这个新上下文。 - 已存在节点处理:版本库中已存在的节点(比如dirB),必须用
openDir(目录)或openFile(文件)进入其上下文,不能用addDir/addFile——后者仅用于创建新节点。 - 节点关闭顺序:必须严格按照打开节点的逆序关闭,确保每个节点都被正确收尾,避免提交失败或目录结构异常。
内容的提问来源于stack exchange,提问作者yab
相关产品推荐
相关产品推荐

