工作分享 - SVN获取不同版本之间的增量文件(差异文件)

该文章介绍了如何通过Java编程的方式,利用SVNKit库自动化获取SVN仓库中不同版本之间的代码差异文件。首先引入SVNKit依赖,然后克隆代码到本地,接着获取两次版本ID,最后比较这两个版本之间的差异文件并打印出来。文章提供了具体的代码示例,鼓励读者一起交流学习。
摘要由CSDN通过智能技术生成

亲测成功!!!

接上一篇文章,放在一起做个分类。

实现效果:主要针对项目业务中,对代码上传方式Git/SVN的更新操作。做到当SVN仓库中出现版本提交时,将差异文件保存到本地。

之前接触的都是手动idea进行差异文件对比,还真没有通过代码的方式来读取过,经过实践成功读取差异文件,分享出来,大家一起学习,欢迎提出建议问题!!!
 

一、依赖

		<dependency>
			<groupId>org.tmatesoft.svnkit</groupId>
			<artifactId>svnkit</artifactId>
			<version>1.10.9</version>
		</dependency>

二、业务逻辑    

        1. 首先将代码克隆到本地/opt/code目录下(我这里放到的是/opt/code);
       2. 获取两次版本的id;
       3. 比较不同版本之间的差异文件;  

三、整体代码

@Test
	public void test() {
		// 初始化数据
		String localPath = "/opt/code"; //本地存放代码地址
		String svnUrl = "https://127.0.0.1:9999/svn/code";//git远程地址
		String username = "admin";//SVN远程地址账户
		String password = "admin";//SVN远程地址密码


		// 初始化支持svn://协议的库。 必须先执行此操作。
		SVNRepositoryFactoryImpl.setup();
		// 相关变量赋值
		SVNURL repositoryURL = null;
		try {
			repositoryURL = SVNURL.parseURIEncoded(svnUrl);
		} catch (Exception e) {

		}
		ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
		// 实例化客户端管理类
		SVNClientManager clientManager = SVNClientManager.newInstance((DefaultSVNOptions) options, username, password);

		// 1.首先将代码克隆到本地/opt/code目录下 (克隆位置自行选择)
		File wcDir = new File(localPath);
		SVNUtil.checkout(clientManager, repositoryURL, SVNRevision.HEAD, wcDir,
				SVNDepth.INFINITY);

		// 2.获取两次版本的id
		//记录第一次拉取的版本
		long oldVersion = getVersion(localPath);
		//更新本地代码(SVN仓库最新的代码)
		SVNUtil.update(clientManager, wcDir, SVNRevision.HEAD, SVNDepth.INFINITY);
		//记录第二次拉取的版本
		long newVersion = getVersion(localPath);

		//3. 比较不同版本之间的差异文件
		try {
			SVNDiffClient diffClient = clientManager.getDiffClient();
			SVNDiffStatusHandler diffStatusHandler = new SVNDiffStatusHandler();
			diffClient.doDiffStatus(SVNURL.parseURIEncoded(svnUrl), SVNRevision.create(oldVersion),SVNURL.parseURIEncoded(svnUrl) , SVNRevision.create(newVersion), SVNDepth.INFINITY, false, diffStatusHandler);
			List<String> diffFiles = diffStatusHandler.getPathList();
			if (!diffFiles.isEmpty()) {
				for (String diffFile : diffFiles) {
					System.out.println("差异文件:" + diffFile);
					//后续逻辑根据具体需求,自行添加
				}
			}
		} catch (SVNException e) {
			e.printStackTrace();
		}
    }

四、引用方法

	/**
	 * 创建 SVNDiffStatusHandler
	 */
	private static class SVNDiffStatusHandler implements ISVNDiffStatusHandler {
		List<String>  pathList= new ArrayList<>();
		@Override
		public void handleDiffStatus(SVNDiffStatus diffStatus) throws SVNException {

			if (diffStatus.getModificationType() != SVNStatusType.STATUS_NORMAL) {
				pathList.add(diffStatus.getPath());
			}
		}
		public List<String> getPathList(){
			return pathList;
		}
	}

	/**
	 * 获取代码的最新提交ID
	 */
	private static long getVersion(String srcPath){
		SVNClientManager svnClientManager = SVNClientManager.newInstance(new DefaultSVNOptions());
		SVNStatus svnStatus = null;
		try {
			svnStatus = svnClientManager.getStatusClient().doStatus(new File(srcPath), false);
		} catch (SVNException e) {
			e.printStackTrace();
		}
		return svnStatus.getRevision().getNumber();
	}

希望大家一起交流,有问题或者有什么建议大家一起交流!!! 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值