# SVN代码同步工具 **Repository Path**: Marco_Wht/svn-code-sync-tool ## Basic Information - **Project Name**: SVN代码同步工具 - **Description**: No description available - **Primary Language**: Python - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-21 - **Last Updated**: 2026-07-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SVN Code Sync Tool

一个企业级 SVN 多分支代码同步分发工具

Java 8 Spring Boot 2.7.18 Vue 3 Element Plus SVNKit MySQL License

--- ## 项目简介 在企业研发过程中,经常存在一个主项目仓库向多个子项目仓库分发代码的场景。**手动复制文件、逐个仓库提交**不仅效率低下,还容易遗漏或出错。 **SVN Code Sync Tool** 提供了一套完整的可视化解决方案: - 连接主项目 SVN 仓库,浏览提交历史 - 选择需要同步的版本和文件 - 自动将代码变更按路径映射规则分发到目标子项目工作副本 - 一键提交到目标 SVN 仓库,**commit message 也同步过去** - 全程可追溯,每次同步都有完整的文件级明细记录 --- ## 核心功能 | 功能 | 说明 | |------|------| | 主项目管理 | 配置 SVN 主仓库地址与认证凭据(密码 AES 加密存储) | | 子项目管理 | 管理多个目标子项目,支持独立的 SVN 地址、凭据、路径映射规则 | | 提交日志浏览 | 拉取主项目提交历史,按版本查看变更文件列表 | | 代码同步执行 | 按版本将主项目变更文件同步到子项目工作副本并自动提交 | | 文件差异对比 | 双击任意文件即可查看版本间的 diff(基于 java-diff-utils) | | 路径映射规则 | 灵活配置源路径到目标路径的映射,适配不同项目结构 | | 冲突处理策略 | 支持覆盖 / 跳过 / 人工处理三种冲突策略 | | 同步重试 | 失败记录可直接重试,无需重新勾选版本和文件 | | 同步历史追溯 | 每次同步都有完整的文件级明细记录和状态追踪 | | 分布式并发控制 | 基于 Redis 分布式锁,防止同一子项目并发同步冲突 | --- ## 技术栈 ### 后端 | 组件 | 版本 | 用途 | |------|------|------| | Spring Boot | 2.7.18 | Web 应用框架 | | Java | 1.8 | 运行环境 | | MyBatis-Plus | 3.5.5 | 持久层 ORM | | SVNKit | 1.10.11 | SVN 仓库操作核心库 | | MySQL | 8.0+ | 业务数据存储 | | Redis | 6.0+ | 分布式锁 / 并发控制 | | Redisson | 3.23.5 | Redis 客户端 + 分布式锁 | | Hutool | 5.8.25 | 通用工具集 | | java-diff-utils | 1.3.0 | 文本差异对比 | ### 前端 | 组件 | 版本 | 用途 | |------|------|------| | Vue | 3.4 | 前端框架 | | Vue Router | 4.3 | 单页路由 | | Element Plus | 2.5.6 | UI 组件库 | | Axios | 1.6.7 | HTTP 请求 | | Vite | 5.1 | 构建工具 | --- ## 项目结构 ``` svn-code-sync-tool/ ├── svn-sync-backend/ # 后端工程 │ └── src/main/java/com/svnsync/ │ ├── SvnSyncApplication.java # 启动类 │ ├── config/ # 配置(跨域、自动填充) │ ├── controller/ # 接口控制器 (3个) │ │ ├── SvnSyncController.java # 同步执行 / 记录 / 差异 │ │ ├── SvnSyncProjectController.java # 子项目配置管理 │ │ └── SvnProjectController.java # 主项目配置管理 │ ├── service/ # 业务服务层 │ │ ├── SvnKitService.java # SVNKit 底层封装接口 │ │ ├── SvnSyncService.java # 同步业务接口 │ │ └── impl/ │ │ ├── SvnKitServiceImpl.java # SVN 操作实现(日志/导出/提交/diff) │ │ ├── SvnSyncServiceImpl.java # 同步业务实现 │ │ └── SvnSyncExecutor.java # 同步执行器(核心引擎) │ ├── entity/ # 数据实体 (4个) │ ├── mapper/ # MyBatis Mapper 接口 │ └── dto/ # 数据传输对象 │ ├── svn-sync-frontend/ # 前端工程 │ └── src/ │ ├── main.js # 入口(Element Plus + 中文语言包) │ ├── App.vue # 根组件(全局样式) │ ├── router/index.js # 路由配置 │ ├── api/svn.js # 后端 API 封装 │ └── views/ │ ├── svn-project/ # 主项目配置管理页 │ ├── sync-project/ # 子项目配置管理页 │ ├── svn-sync/ # 同步执行页(核心操作) │ └── svn-history/ # 同步历史记录页 │ ├── svn-sync-schema.sql # 数据库建表脚本(3 张表) └── README.md # 本文件 ``` --- ## 快速开始 ### 环境要求 - **JDK 1.8+**(SVNKit 对 TLS 1.0 的要求,建议使用 Java 8) - **Node.js 16+**(用于前端) - **MySQL 8.0+** - **Redis 6.0+**(用于分布式锁) - **Maven 3.6+** ### 1. 数据库初始化 ```sql -- 创建数据库 CREATE DATABASE IF NOT EXISTS svn_sync DEFAULT CHARSET utf8mb4; -- 执行建表脚本 source svn-sync-schema.sql; ``` 脚本会自动创建 3 张表: | 表名 | 说明 | |------|------| | `svn_sync_project` | 子项目 SVN 配置(地址、凭据、路径映射、冲突策略) | | `svn_sync_record` | 同步记录(源版本号、状态、文件数、成功/失败数) | | `svn_sync_detail` | 同步文件明细(源路径、目标路径、操作类型、状态) | ### 2. 后端配置与启动 编辑 `svn-sync-backend/src/main/resources/application.yml`: ```yaml server: port: 48080 spring: datasource: url: jdbc:mysql://你的MySQL地址:3306/svn_sync?useSSL=false&serverTimezone=Asia/Shanghai... username: 你的数据库用户名 password: 你的数据库密码 driver-class-name: com.mysql.cj.jdbc.Driver redis: host: 你的Redis地址 port: 6379 # SVN 主项目默认配置(可在前端页面中修改) svn: master: url: https://你的SVN地址/svn/主项目 username: SVN用户名 password: SVN密码 work-dir: ./svn-workdir ``` 编译启动: ```bash cd svn-sync-backend mvn clean package -DskipTests java -jar target/svn-sync-backend-1.0.0.jar \ --server.port=48080 \ --management.server.port=-1 ``` > **注意**:如果运行环境有其他 Java 进程设置了 `server.port` 系统属性,可能导致端口冲突。务必通过命令行参数显式指定 `--server.port`,并用 `--management.server.port=-1` 禁用管理端口。 ### 3. 前端启动 ```bash cd svn-sync-frontend npm install npm run dev ``` 前端开发服务器默认运行在 `http://localhost:80`。如需修改端口,请编辑 `vite.config.js`。 ### 4. 访问系统 浏览器打开 `http://localhost`,即可进入系统。 --- ## 使用指南 ### Step 1:配置主项目 进入「主项目管理」页面,添加你的 SVN 主仓库信息(地址、用户名、密码)。 ### Step 2:配置子项目 进入「子项目管理」页面,为每个需要同步代码的目标仓库添加配置: - **项目名称**:目标子项目的标识名称 - **SVN 地址**:目标仓库地址 - **SVN 凭据**:目标仓库的用户名密码 - **路径映射规则**:配置源路径到目标路径的映射关系(见下方说明) - **冲突策略**:当目标文件已存在时的处理方式 ### Step 3:执行代码同步 进入「同步代码」页面: 1. 左侧面板:浏览主项目的提交记录,**勾选**需要同步的版本 2. 中间面板:查看所选版本的变更文件列表(自动全选,可按需调整) 3. 右侧面板:选择需要同步到的目标子项目 4. 点击「开始同步」按钮 系统会自动: 1. 从主项目 SVN 导出选中版本的文件 2. 按路径映射规则复制到目标工作副本 3. 用 `[CodeSync] 原始commit message` 的格式提交到目标 SVN ### Step 4:查看同步历史 进入「同步历史」页面,查看每次同步的: - 源版本号、目标项目、同步状态 - 文件级明细(哪些文件成功/失败/跳过) - 双击文件可查看版本差异对比 - 失败的记录可直接点击「重试」 ### 路径映射规则 路径映射是一个 JSON 数组,每个元素包含 `sourcePrefix` 和 `targetPrefix`: ```json [ { "sourcePrefix": "/主干/src/main/java/com/example/", "targetPrefix": "/分支A/src/main/java/com/example/" }, { "sourcePrefix": "/主干/src/main/resources/", "targetPrefix": "/分支A/src/main/resources/" } ] ``` 大多数情况下,如果源和目标项目的内部目录结构一致,系统会自动处理路径前缀剥离,**无需手动配置映射规则**。 --- ## 架构说明 ### 同步流程 ``` 用户选择版本 + 文件 + 目标子项目 │ ▼ 获取分布式锁(防并发冲突) │ ▼ SVNKit 导出主项目指定版本文件 │ ▼ 按路径映射规则复制到目标工作副本 │ ▼ SVNKit add + commit 到目标仓库 commit message = [CodeSync] + 原始message │ ▼ 更新数据库同步状态 → 释放锁 ``` ### 安全说明 - **SVN 密码**:数据库中采用 AES 加密存储,不在日志中明文输出 - **分布式锁**:基于 Redis Redisson 实现,同一个子项目同一时间只允许一个同步任务执行,避免并发冲突 - **工作副本隔离**:每个子项目维护独立的本地工作副本目录 --- ## License MIT License --- ## 联系方式 如有问题或建议,欢迎提交 Issue 或 Pull Request。 --- **Made with ❤️ by SVN Code Sync Team**