SVN 仓库自动同步与 FTP 共享实战:定时检出 + 导出纯净代码

Linux V3H 平台开发系列讲解(摄像头)2.3.1 MAX96912 MAX96717 GMSL1 CSI 2lane配置 ​ 单路摄像头,数据流类型YUV422, mipi接口,经过MAX96717 串行器,gmsl1链路 到解串器MAX96712,最后mipi csi 2lane(lane0 lane1)输出到 renesa v3h soc开发板; ​ 阅读详情

一、背景与痛点

最近公司内部做了一次 SVN 服务器迁移,虽然仓库数据没变,但服务器 IP 变了。为了让部分只读同事能通过 FTP 方便地浏览最新代码(无需安装 SVN 客户端),我在 SVN 服务器上搭建了 FileZilla FTP 服务,并需要一个自动化流程:

  1. 每天定时从本地 SVN 仓库拉取最新代码
  2. 导出为纯净的不含 .svn 目录的文件夹
  3. 将导出的目录共享给 FTP 用户(只读权限)

这样既保留了 SVN 版本控制的优势,又让非技术人员能像访问普通文件一样获取最新代码。


二、整体方案

  • SVN 服务器:VisualSVN Server 5.4.4,仓库位于 E:\SVN_Server\Repositories\idc
  • FTP 服务器:FileZilla Server 0.9.60,端口改为 21,共享目录 E:\xxksharefiles\xxkfiles\idc
  • 自动化:Windows 批处理脚本 + 任务计划程序(每天凌晨 2 点执行)

核心思路:
维护一个本地工作副本(Working Copy),每次先 svn update 增量更新,再 svn export 到 FTP 共享目录。这样更新极快(只拉变更),导出也是本地复制,对服务器几乎无压力。


三、脚本详解

以下是实际运行的 svn_update_and_auto_export.bat(已脱敏):
如果执行报错,可删除脚本中的中文注释

@echo off
chcp 65001 > nul
setlocal enabledelayedexpansion

:: 仓库 URL(注意空格用 %20 编码)
set "SVN_REPO=file:///E:/SVN_Server/Repositories/idc"

:: 工作副本目录(存放 .svn 信息)
set WORKING_COPY=E:\SVN_WorkingCopy\idc

:: 最终导出目录(FTP 共享的根目录)
set EXPORT_DIR=E:\xxksharefiles\xxkfiles\idc

:: 日志目录
set LOG_DIR=E:\SVN_Server\Log
set LOG_FILE=%LOG_DIR%\sync_log.txt

:: 创建日志目录
if not exist "%LOG_DIR%" mkdir "%LOG_DIR%"

echo %date% %time% - Starting update and export >> "%LOG_FILE%"

:: 如果工作副本不存在则 checkout,否则 update
if not exist "%WORKING_COPY%\.svn" (
    echo First time checkout... >> "%LOG_FILE%"
    svn checkout "%SVN_REPO%" "%WORKING_COPY%" >> "%LOG_FILE%" 2>&1
) else (
    echo Updating working copy... >> "%LOG_FILE%"
    svn update "%WORKING_COPY%" >> "%LOG_FILE%" 2>&1
)

:: 删除旧的导出目录,重新导出(保证纯净)
echo Exporting from working copy... >> "%LOG_FILE%"
if exist "%EXPORT_DIR%" rmdir /s /q "%EXPORT_DIR%"
svn export --force "%WORKING_COPY%" "%EXPORT_DIR%" >> "%LOG_FILE%" 2>&1

echo %date% %time% - Finished >> "%LOG_FILE%"
echo. >> "%LOG_FILE%"
pause

3.1 关键变量说明

变量含义示例值
SVN_REPOSVN 仓库 URLfile:///E:/SVN_Server/Repositories/idc
WORKING_COPY本地工作副本路径E:\SVN_WorkingCopy\idc
EXPORT_DIR导出目录(FTP 共享用)E:\xxksharefiles\xxkfiles\idc

3.2 核心命令

  • svn checkout:首次拉取完整仓库
  • svn update:后续更新(只拉差异)
  • svn export:从工作副本导出纯净代码(不含 .svn)

为什么不用 svn export 直接从仓库导出?
从工作副本导出是本地复制,几乎零耗时;直接从仓库导出每次都要全量读取仓库文件,仓库大了会很慢。


四、遇到的坑与解决方法

4.1 路径中的空格问题

SVN 的 file:// 协议不支持空格,必须编码为 %20。
❌ 错误:file:///E:\SVN Server\Repositories\idc
✅ 正确:file:///E:/SVN%20Server/Repositories/idc

同时,在批处理中引用带空格的路径时,务必用双引号包裹:"%WORKING_COPY%"。

4.2 中文注释导致“不是内部或外部命令”

如果脚本保存为 UTF-8 编码,:: 后面的中文会被错误解析。
解决:使用 REM 代替 ::,并将脚本保存为 ANSI 编码;或者直接删掉中文注释。

4.3 Access is denied 权限错误

  • 确保运行脚本的用户对 WORKING_COPY 目录有完全控制权限
  • 以管理员身份运行脚本(或任务计划中勾选“使用最高权限运行”)

4.4 % 符号在 URL 中被解释为环境变量

批处理中 % 有特殊含义。要将文字 %20 写入变量,使用 set "VAR=..." 格式(等号后紧跟双引号)可以避免被提前展开。

4.4 win7电脑访问ftp每次跳转浏览器乱码

  • 参考链接:FTP解决跳转浏览器的三种方法

  • 我是方法三解决的
    一般会提示弹窗:
    ftp由于代理服务器设置为完全访问,所以文件夹ftp://******将为只读属性。
    请尝试以下步骤:
    1.先禁用IE高级选项里的FTP文件夹视图,点确定,再重新勾选启用,再点确定;
    2.打开任务管理器关闭explorer.exe进程;


五、设置定时任务

  1. 按 Win + R → taskschd.msc 打开任务计划程序
  2. “创建基本任务” → 名称:“SVN 自动导出到 FTP”
  3. 触发器:每天,凌晨 2:00
  4. 操作:启动程序 → 浏览选择 svn_update_and_auto_export.bat
  5. 完成

注意:如果脚本中有 pause,请删除它,否则任务会一直等待。


六、FTP 客户端连接方式

FileZilla Server 端口已改为 21,Windows 客户端连接方法:

使用 Windows 资源管理器

  • 打开“此电脑” → 右键“添加一个网络位置”
  • 地址填写:ftp://你的服务器IP:21
  • 输入用户名/密码 → 完成

使用 FileZilla Client

  • 主机:你的服务器IP,端口:21
  • 协议:FTP,加密:根据服务器设置选择(建议显式 TLS)

使用命令行

ftp
open 你的服务器IP 21
(然后输入用户名和密码)

widows访问成功截图

ftp://ip:21/

在这里插入图片描述

七、最终效果

  • 每天凌晨自动将 SVN 最新代码同步到指定目录
  • FTP 用户只读访问该目录,看到的是干净的文件树(无 .svn)
  • 整个过程全自动,日志记录在 E:\SVN_Server\Log\sync_log.txt

这套方案已稳定运行两周,解放了运维人员的手动操作,也满足了非开发人员获取最新文档/代码的需求。


八、改进建议

  • 使用域名代替 IP:如果未来服务器 IP 再次变更,只需修改 DNS 或 hosts 文件。
  • 日志轮转:可加入按日期切割日志的逻辑,避免单个日志文件过大。
  • 错误告警:检查 svn update 或 svn export 的返回值,失败时发送邮件通知。

希望这篇文章能帮助到有类似需求的朋友。如果你在搭建过程中遇到问题,欢迎留言交流。

试读源码在这里下载 试读文章的源码在这里下载。源码不做任何修改,重点重点重点:为了代码运行不报错,安装matlab 版本为 2021 及以上版本。matlab安装教程大家可以参考这个教程:手把手教你安装matlab软件。 阅读详情

相关推荐

Field _II 仿真 学习笔记

参考Field II的使用说明,进行了四个例子的练习。仿真程序和结果如下: PURPOSE1:Calculate the received response from all elements of a linear array and plot the responses and the summed response 【计算来自所有线性阵元的接收响应,并绘制该响应以及叠加响应。】 >>

qq_34018578的博客 1万+

svn按人名搜索log

推荐使用SVN 1.8+的svn log --search "作者名"命令,可直接模糊匹配作者、日志或路径,高效定位提交记录。配合-l限制条数避免输出过多。若不支持,可用--author(如支持)或grep/sed管道过滤旧版本输出。Windows用户可借助TortoiseSVN图形界面直观筛选。优先选择内置选项,兼顾兼容性与效率。

92

华为海思2026届数字IC秋招笔试高频考点解析与实战技巧(2025最新版)

本文深入解析华为海思2026届数字IC秋招笔试的高频考点与实战技巧,涵盖时序优化、低功耗设计、DFT规则等核心模块。针对2025年最新真题,提供详细的解题思路和工程经验,帮助考生高效备考。特别关注SystemVerilog约束随机测试等新增考点,助力考生在秋招笔试中脱颖而出。

m2n3o4p5的博客 415

Docker Compose:搭建本地多服务开发环境

从一个 Java API、PostgreSQL 和 Redis 开始,配置服务名、端口、环境变量、健康检查、数据卷和依赖关系。理解 Compose 文件如何被解析、项目如何隔离,以及哪些数据不能依赖“重建容器”保留,能够把个人开发环境整理成团队可复用的启动入口。

m0_62221377的博客 459

从高德、百度地图下载POI数据?用这个工具5分钟搞定GCJ02/BD09到WGS84的坐标纠偏

本文详细解析了高德、百度地图POI数据坐标偏移问题,并提供了从GCJ02/BD09到WGS84的高效转换方案。通过开源工具如coordtransform和ArcGIS等专业软件,实现毫米级精度的坐标纠偏,适用于商业选址、GIS分析等场景,显著提升数据准确性和工作效率。

weixin_26789847的博客 450

VSCode+Pyside6开发环境配置全攻略:从安装到实战UI设计

本文提供了一份详细的VSCode与Pyside6集成开发环境配置指南。从创建Python虚拟环境、安装必备VSCode插件,到深度配置PYQT Integration插件以打通Qt Designer与代码编译,最后通过一个待办事项应用实战演示了从UI设计到业务逻辑绑定的完整工作流,旨在帮助开发者建立高效、可维护的GUI开发环境。

qq_27496129的博客 981

【Linux网络】TCP 服务器并发处理多客户端:从 fork 分发到双重 fork 彻底消灭僵尸进程

拆解 TCP 服务器并发演进链:fork 分发连接、SIGCHLD 循环回收僵尸、双重 fork 交孙进程给 init 收养,并给出模型选型与线上排错对照。

2301_78967866的博客 427

从零解析特斯拉线圈:谐振变压器的核心原理与DIY实践

本文深入解析特斯拉线圈的工作原理与DIY实践,从LC振荡电路到电磁耦合,详细介绍了谐振变压器的核心原理。通过材料清单、绕制技巧和安全指南,帮助爱好者从零开始打造迷你闪电发生器,体验高压电子实验的独特魅力。

weixin_33670786的博客 493

企业版虚拟机ESXi网络配置

1. 把卷组里剩下的所有空间(100%FREE)全加给根目录。# 2. 刷新文件系统,让系统立刻认出新容量。

墨痕诉清风的博客 230

准静态电磁场

叠加法 缺点:对于连续分布的电荷,叠加法的计算比较困难 虚位移法 概念 广义坐标:确实系统中导体形状、尺寸与位置的一组独立几何量。 广义力:企图改变某一广义坐标的力。 功:广义力乘上由它引起的广义坐标的改变量。 公式 ...

qq_35912930的博客 1860

教你如何阅读Autosar代码(6):常量变量定义

编译器抽象应该为常量的声明和定义定义CONST宏。编译器抽象应该定义VAR宏来声明和定义变量。memclass:常量本身的分类;memclass:变量本身的分类;vartype:变量的类型;type:常量的类型;

wdconan001的博客 958

给openlab搭建web网站

此时输入song 账号 即可登录。

ytdbc的博客 105

【华为OD机考真题】- 构成的正方形数量(B卷-100分)(Java版)

🔔本文收录于「最新最全华为OD机试真题(Java版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅!题库正在疯狂收录中,up!up!up!! 🚫提醒:拒绝一切代考/替考,违法必究!专栏所写题库均精心搜集于互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验所撰,欢迎订阅。    💗订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,后续题库更新

**My Coding Family** 1349

本地化部署会议视频软件如何替换旧平台?账号迁移、历史数据与用户培训怎么安排?

账号先映射:身份与权限验证通过,再开放使用。资料分级处理:能查、能读、权限正确,比“全部搬完”更重要。切换可恢复:入口、增量数据和业务通知都要纳入回退方案。培训按岗位落地:让用户完成真实任务,而不是只听功能介绍。这套方法适合政企、集团及医疗等具有长期资料留存、多终端接入和业务集成需求的组织。小规模替换可以简化批次与流程,但不应省略权限验证、备份恢复和关键会议演练。

hz56789的博客 285

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

自动化运维选型:四条技术路线的能力边界,以及它们为什么不能互相替代

自动化运维怎么选型?拆解配置管理、基础设施即代码、作业调度与场景化编排四条技术路线边界,分析账本归属与时间语义差异,给出四种架构组合与判断点,帮企业看清为何不能互相替代。

trainsignalcn的专栏 327

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

中科热备备份一体机选型技术剖析:安全厂商跨界后的能力边界与实测数据对比

灾备与数据保护技术实战:CDP持续保护、数据库备份、异地容灾架构等核心技术深度解析。

weixin_70618949的博客 291

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

越华环保集团碳惠小屋|面向碳普惠场景的 IoT 终端与碳数据链路设计方案

越华环保集团碳惠小屋这套 IoT 碳数据方案,把物联网感知技术和碳普惠业务规则深度绑定,补齐了碳普惠线下可信数据源短板。相比通用回收设备,它的核心价值在于标准化碳数据链路与可对接上层碳普惠平台的开放能力。随着各地碳普惠数字化建设提速,对合规、可溯源线下采集终端需求持续增长。这套架构具备良好扩展性,后续可以继续接入骑行、节水节电等更多低碳感知终端,作为统一的公众低碳数据采集底座,支撑区域碳普惠数字化体系持续迭代升级。

MuMuMu1223的博客 192

Docker 与 Kubernetes 深度解析:从容器运行时到集群编排

维度DockerKubernetes回答的问题一个进程怎么隔离、打包、分发一堆进程怎么调度、连接、自愈抽象层级运行时 + 镜像格式分布式操作系统最小单元ContainerPod状态模型命令式(run声明式(apply)+ 控制循环收敛作用范围单机跨主机集群核心协议CRI / CNI / CSI(可插拔)失效时表现容器挂掉,没人管控制器自动重建学习曲线一天半年Docker 定义了"一个应用的形状",Kubernetes 定义了"一群应用如何共生"。

2601_95494915的博客 595

ubuntu安装hadoop系统

本文详细介绍了基于VMware克隆虚拟机搭建三节点Hadoop分布式集群的全过程:使用同一Ubuntu镜像克隆出master、worker1、worker2三台虚拟机,依次配置主机名、固定IP(如192.168.82.10/11/12)、SSH服务及免密登录,确保节点间网络互通。随后安装Java,下载配置Hadoop并分发至各节点,最终初始化启动集群,验证其存储与计算功能,实现高效的大数据环境部署。

qq_43592674的博客 336

Linux篇(五)

本文系统梳理了Linux常用终端快捷键、软件包管理(yum/apt)、服务管理(systemctl)、软链接(ln)、时间与IP配置、域名解析、固定IP设置及网络命令(ping/wget/curl),涵盖日常运维核心操作,助力高效管理Linux环境。

wykyzdq的博客 202

docker部署IPTV

【代码】docker部署IPTV。

wuxingge的博客 47

FineBI、Power BI、Tableau 建模能力实测:2026 年三款主流 BI 的性能与运维成本对比

其二为权限与安全的工程化程度。原因并非其某一单点最强,而是其将建模、性能、运维这三项最易被忽视又最决定成败的因素,做成了一个相对均衡、且面向国内企业场景默认到位的整体,这是其与另两款产品的真正差异所在。FineBI 在企业级落地与长期运维的省心程度上领先,Power BI 在建模与计算上限上领先,Tableau 在分析体验上领先,三者分别适合不同的团队与场景。FineBI、Power BI、Tableau 的建模能力并非简单的强弱之分,三款产品对数据模型的理解存在根本差异,这一差异决定了后续各维度的表现。

Leo的博客 98

Kubernetes 集群部署

实验环境:VMware Workstation 26 + Rocky Linux 9.8 + Kubernetes v1.35.10 + Docker 29.9.3 + cri-dockerd 0.4.10。

2302_80967029的博客 157

DevOps进阶-下篇-Harbor私有仓库与自动化部署

环节现在的状态问题代码GitLab 托管,Tag 管版本✅ 没问题构建Jenkins 跑 Maven,产出 jar✅ 没问题质量SonarQube 扫描 + 门禁✅ 没问题制品jar 直接 SCP 到服务器,服务器上❌这里全是洞部署服务器本地重建容器❌ 无版本、无回滚、无审计镜像没有统一存放地。每台机器自己build,同一个 tag 在不同机器上可能是不同的东西——"环境一致性"直接破功;无法回滚。jar 覆盖了就没了,出事想退回上一版?

weixin_45488455的博客 597

邮件提交协议(MSA):与标准 SMTP 有何不同?

上周有个客户的运维把发信程序从 25 端口改到 587,账号密码都填了,日志里还是 530 5.7.0。他把日志甩过来,问是不是我们把认证关了。认证没关。他那套代码从头到尾没发过 AUTH——EHLO、MAIL FROM、RCPT TO、DATA,四步走完就等 250。这套流程在 25 端口上跑了七八年,一次没出过事。同一个程序换个端口就死,这件事本身比故障有意思:25 和 587 之间隔着的,是两种角色,端口号只是外面那层皮。

2503_92398835的博客 325

GPU 抢不到?SkyPilot 一条命令跨云找卡

SkyPilot 是一个开源的 AI 算力调度系统:用一份 YAML 描述任务,sky launch就能在你的 Kubernetes、Slurm 或 20 多家云里找到最便宜、有货的 GPU,缺货自动换地方,闲置还能自动回收。

307
上一篇: Windows下BAT脚本中文乱码问题:根源剖析与终极解决方案
xx~
xx~
博客等级 码龄8年 8375粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值