You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:11:13