Java SVNKit-获取要提交的修改

Java SVNKit-获取要提交的修改,java,svn,svnkit,Java,Svn,Svnkit,我使用SVNKit库开发了一个Java程序,负责在版本控制下更新或提交目录。 目录内容可以由另一个我无法控制的程序更改,该程序可以添加、删除或编辑忽略的文件来设置subversion信息 问题是«我的程序如何知道要提交什么 由于未添加新文件,我尝试处理rootDirectory的doImport,但它会导致SVNException,表示该文件已存在于存储库端 SVNCommitClient cc = cm.getCommitClient(); cc.doImport(new File(subVe

我使用SVNKit库开发了一个Java程序,负责在版本控制下更新或提交目录。 目录内容可以由另一个我无法控制的程序更改,该程序可以添加、删除或编辑忽略的文件来设置subversion信息

问题是«我的程序如何知道要提交什么

由于未添加新文件,我尝试处理rootDirectory的doImport,但它会导致SVNException,表示该文件已存在于存储库端

SVNCommitClient cc = cm.getCommitClient();
cc.doImport(new File(subVersionedDirectory), SVNURL.parseURIEncoded(repositoryURL), "<import> " + commitMessage, null, false, true, SVNDepth.fromRecurse(true));
SVNCommitClient cc=cm.getCommitClient();
cc.doImport(新文件(subVersionedDirectory),SVNURL.parseURIEncoded(repositoryURL),“”+commitMessage,null,false,true,SVNDepth.fromRecurse(true));
我还发现了一段代码,它可能会在提交之前将丢失的文件标记为已删除

cc.setCommitParameters(new ISVNCommitParameters() {
   // delete even those files
   // that are not scheduled for deletion.
   public Action onMissingFile(File file) {
      return DELETE;
   }
   public Action onMissingDirectory(File file) {
      return DELETE;
   }

   // delete files from disk after committing deletion.
   public boolean onDirectoryDeletion(File directory) {
      return true;
   }
   public boolean onFileDeletion(File file) {
      return true;
   }
   });
   cc.doCommit(new File[]{new File(subVersionedDirectory)}, false, "<commit> " + commitMessage, null, null, false, true, SVNDepth.INFINITY);
cc.setCommitParameters(新的ISVNCommitParameters(){
//甚至删除那些文件
//未计划删除的。
对missingfile(File)的公共操作{
返回删除;
}
MissingDirectory(文件)上的公共操作{
返回删除;
}
//提交删除后从磁盘删除文件。
公共布尔OnDirectoryDelete(文件目录){
返回true;
}
公共布尔onfileDelete(文件){
返回true;
}
});
cc.doCommit(新文件[]{new File(subVersionedDirectory)},false,“+commitMessage,null,null,false,true,SVNDepth.INFINITY);

我的程序如何知道提交什么?

我找到的解决方案是在提交之前使用doStatus将删除和添加的文件信息设置到工作副本中

cm = SVNClientManager.newInstance(new DefaultSVNOptions());
// Use do status to set deleted and added files information into SVN working copy management
cm.getStatusClient().doStatus(subVersionedDirectory, SVNRevision.HEAD, SVNDepth.INFINITY, false, false, false, false, new ISVNStatusHandler() {
            @Override
            public void handleStatus(SVNStatus status) throws SVNException {
                if (SVNStatusType.STATUS_UNVERSIONED.equals(status.getNodeStatus())) {
                    cm.getWCClient().doAdd(status.getFile(), true, false, false, SVNDepth.EMPTY, false, false);
                } else if (SVNStatusType.MISSING.equals(status.getNodeStatus())) {
                    cm.getWCClient().doDelete(status.getFile(), true, false, false);
                }
            }
        }, null);        
cm.getCommitClient().doCommit(new File[]{subVersionedDirectory}, false, "<commit> " + commitMessage, null, null, false, true, SVNDepth.INFINITY);
cm=SVNClientManager.newInstance(newdefaultsvnoptions());
//使用do status将已删除和添加的文件信息设置为SVN工作副本管理
cm.getStatusClient().doStatus(subVersionedDirectory,SVNRevision.HEAD,SVNDepth.INFINITY,false,false,false,new-ISVNStatusHandler()){
@凌驾
public void handleStatus(SVNStatus状态)引发SVNException{
if(SVNStatusType.STATUS\u UNVERSIONED.equals(STATUS.getNodeStatus())){
cm.getWCClient().doAdd(status.getFile(),true,false,false,SVNDepth.EMPTY,false,false);
}else if(SVNStatusType.MISSING.equals(status.getNodeStatus())){
cm.getWCClient().dodelite(status.getFile(),true,false,false);
}
}
},空);
cm.getCommitClient().doCommit(新文件[]{subVersionedDirectory},false,“+commitMessage,null,null,false,true,SVNDepth.INFINITY);

+1。但是,已删除文件的if子句应该检查
状态\u MISSING
(而不是
MISSING
)。至少在svnkit的最新版本上(撰写本文时为1.8.7)