从SVN服务器导出指定文件夹,核心思路只有两条:用svn export走纯下载路径,或者用svn checkout拉取后清理掉多余文件,前者输出干净目录,后者保留版本控制信息,按需二选一。
很多朋友第一次接触SVN服务器的时候,都以为“导出”就是把远程仓库里某个文件夹拖到本地,真操作起来才发现要么带出一大堆无关目录,要么右键菜单里找不到对应选项,今天这篇内容不扯大而全的理论,就针对“SVN导出指定文件夹”这一个动作,把命令行、TortoiseSVN图形界面、常见报错全部捋清楚。
为什么SVN导出指定目录没有想象中简单
SVN和网盘完全是两码事,网盘里的文件夹可以直接点开、勾选、下载,SVN服务器上的每个目录都带版本属性,目录和目录之间通过svn://或http://仓库路径组织,你在svn服务器上导出指定目录时,实际上是在和整个仓库的版本树打交道。
这里有个新手最容易忽略的细节:SVN仓库顶层往往包含trunk、branches、tags三个目录,你想导出的目标文件夹通常藏在trunk下面,比如/svn/project/trunk/web/static,如果你只复制了地址栏里的仓库根路径,那导出来的当然是整个项目,这就是“为什么我只想要一个文件夹却下载了几百MB文件”的根源。
行业共识认为,正确操作的前提是搞清目标目录在仓库中的完整路径,路径错了,后面所有命令都是白搭。
svn checkout 指定目录命令:先拉取再清理的方案
适合需要保留.svn隐藏目录的场景,比如你要在这份代码基础上改东西,或者要提交补丁回去。
执行checkout加子目录路径
打开命令行终端,进入你想保存代码的本地目录,然后执行:
svn checkout https://your-svn-server.com/project/trunk/web/static ./static-code
这条命令的作用是:只从SVN服务器拉取web/static这个子目录,不会动仓库里其他任何文件,本地生成的static-code文件夹里会有完整的.svn管理目录,后续执行svn update、svn commit都能正常对应到远程的static路径。
用–depth参数进一步压缩下载体积
有时候目标文件夹里面还有更细分的子目录,但你不全都要,比如只想拉取static/images和static/css,忽略static/js,这种情况下可以配合--depth参数:
svn checkout --depth empty https://your-svn-server.com/project/trunk/static ./temp-static cd temp-static svn update --depth empty images svn update --depth empty css
--depth empty先建一个空壳目录,再按需更新具体子项,多数情况下这种操作比直接checkout完整目录要快很多,尤其是仓库里塞满大体积素材文件的场景。
用svn export导出指定文件夹:最干净省事的方式
如果你只需要把SVN服务器上的某个目录拷下来交给别人,或者部署到测试环境,svn export是Svn服务器目录导出教程里最常用的操作。
直接导出指定目录
svn export https://your-svn-server.com/project/trunk/static ./static-export
执行完成后,static-export目录里没有任何.svn文件,纯纯的静态文件集合,适合打包、压缩、扔到Nginx根目录。
导出到zip压缩包
有些场景下你想直接在服务器上导完就打包,不用两步走,先把文件夹导出到临时位置,再压缩:
svn export https://your-svn-server.com/project/trunk/static ./temp-static zip -r static-export.zip ./temp-static rm -rf ./temp-static
Linux服务器上这是常用组合拳,Windows环境可以用tar -cvf或者直接右键压缩文件夹。
只导出指定版本的快照
默认的svn export会导出最新版本,但有时候线上出问题要回滚,或者要看特定release版本的代码,这时候加-r参数指定版本号:
svn export -r 256 https://your-svn-server.com/project/trunk/static ./static-r256
版本号可以通过svn log查看,列表中每个r开头的数字就是版本号。
TortoiseSVN图形界面下怎么从SVN拉取指定目录
命令行更适合脚本或专业开发者,日常办公场景下,TortoiseSVN导出指定文件夹最简单的方法就是打开仓库浏览器操作。
通过Repo Browser定位目标目录
- 在资源管理器空白处右键,选择
TortoiseSVN→Repo-browser - 输入仓库地址,回车
- 展开
trunk或其他分支目录树 - 找到你想要的文件夹,直接右键点击这个文件夹,而非仓库根目录
- 菜单里选择
SVN Export...或Checkout...
两种功能的菜单差异
| 功能 | 菜单入口 | 导出结果 | 适用场景 |
|---|---|---|---|
| SVN Export | 右键文件夹 → SVN Export… | 纯净文件,无.svn目录 | 发版、传文件、部署 |
| Checkout | 右键文件夹 → Checkout… | 带.svn目录,保留版本关系 | 开发修改、持续维护 |
选SVN Export后,界面会让你选本地保存路径,还会让你选择导出的版本(HEAD revision或指定revision),导出深度(Depth)默认是Fully recursive,如果你只想导出当前目录一层,选Only this item即可,这个选项经常被人忽略。
避免把整个仓库导出的两个操作要点
- 在Repo-browser里不要勾选“允许自动选择根目录”这类选项,右键前确认选中的不是顶层节点
- 如果URL地址栏里显示的是仓库根路径,一定要改成包含子目录的完整路径
svn只导出某个文件夹内部全部文件时的坑
导出看起来简单,实际操作过程中有几个高频报错,这里集中列出来,你直接对号入座就行。
路径404或No such revision
当你用svn export http://xxxx/trunk成功,但换成http://xxxx/trunk/src/components却报错,第一反应不应该是SVN坏了,先用svn ls验证路径:
svn ls http://your-svn-server.com/project/trunk/src/components
如果svn ls也能看到文件列表但export报错,检查目录名大小写和特殊字符,SVN仓库路径是区分大小写的,Components和components是两个不同的目录,据统计,相当一部分“导出失败”纯粹是路径手滑。
权限导致的无权限导出
SVN服务器端有目录级别的认证控制,有的目录只允许特定用户组访问,遇到Access denied或者Authorization failed,解决方案就是在命令中加上认证信息:
svn export --username your-name --password your-pass https://your-svn-server.com/project/trunk/static ./static
注意密码如果包含特殊字符,比如或,在Linux bash中需要用单引号包起来:--password '$p@ssw0rd'。
导出中断了怎么办
SVN不支持断点续传,但可以重复执行导出命令,第二次执行时,SVN会检查本地已存在的文件,跳过未变化的,只继续下载剩余部分,所以遇到网络中断,不要删掉已下载的文件,直接重新跑一遍原命令即可。
SVN导出指定文件夹后还需要做的事
很多朋友导出来就以为万事大吉,其实还差两步。
确认目录结构完整性
导出完成后,先执行find static-export -type f | wc -l统计文件数量,再和仓库里的对比,如果仓库里显示180个文件,本地只有120个,大概率是--depth参数或者权限问题导致部分文件漏导出。
清理SVN残留配置
如果你用的是checkout方式导出,目录里会有.svn文件夹,交付给同事时,为了防止对方误执行svn update或svn commit提交到你的仓库里,打包前记得先执行:
svn export ./checked-out-dir ./clean-dir
或者直接删除隐藏目录:
rm -rf ./checked-out-dir/.svn
SVN导出指定文件夹的常见问题解答
这里汇总几个后台经常被问到的问题,如果你正卡在某个环节,直接看是否有对应场景。
Q:有没有更快的批量导出SVN多个子目录的侧面方法?
A:假设trunk下面有10个文件夹,但你只需要其中3个,最直接的方式是执行3条svn export命令,不推荐先checkout完整仓库再删除其余7个,这样会造成无效的网络传输,如果经常要固定导出这一组目录,建议写一个简单的shell脚本,把这3个导出命令按顺序放进去,之后每次跑一次脚本就行,省得每天敲重复命令。
Q:SVN服务器导出指定目录会不会影响其他用户?
A:不会。svn export和svn checkout都只执行读操作,不会锁定版本库,也不影响其他开发者提交代码,唯一可能出现的影响是,大量导出操作会占用一定的服务器带宽和I/O资源,如果你的仓库体量非常大,建议避开团队日常提交的高峰时段去执行。
Q:导出的文件夹内缺少svn的版本信息,这是不是异常的?
A:不是。svn export的设计目标就是生成一份不包含.svn元数据的“干净副本”,让文件脱离版本控制独立使用,如果连隐藏目录一起交付,也能达到“部署时不希望带出去”的效果,如果你希望导出后保留版本库的关联关系,请改用svn checkout指令,后者的工作副本会保留所有提交过的版本信息,并支持后续的update和commit操作。
从这里可以看到,SVN导出指定文件夹的本质就是给服务器路径套一层操作指令,不管用checkout还是export,核心要素就是两条:精确的远程路径、正确的导出深度,搞清楚这两个变量,目录隔离导出就是一条命令的事。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/774976.html


