◆

SVN 常用命令:安装、拉取代码与带账号密码 checkout

2023-02-02 01:370

平时都用 git,偶尔接手老项目会碰上 SVN。这两个东西思路差别不小:git 是分布式的,本地有完整仓库,commit 只写本地;SVN 是集中式的,只有一个中央仓库,svn commit 直接提到服务器,本地工作副本只保存一份基线。理解了这点,下面几个现象就好解释了。

svn log 没查看到自己最新提交的信息

svn update 一下 再次 svn log 即可

原因就出在集中式这个特点上。svn log 默认查的不是服务器,而是本地工作副本记录的那个修订版本范围——工作副本停留在 update 时的版本号上,之后服务器上新增的提交(包括你自己从别处提的)它并不知道。svn update 把工作副本的版本号推到最新,log 才能看到。

想跳过 update 直接查服务器,可以给 log 加上仓库 URL 或者显式指定修订版本:svn log -r HEAD:1 会去问服务器要最新的记录。

安装

macOS 从 Xcode Command Line Tools 里移除了 svn 客户端,系统默认不再自带,需要自己装。用 Homebrew 装最省事:

brew install svn

装完 svn --version 确认一下。如果只是要图形界面,macOS 上有 Cornerstone、SmartSVN 这类客户端,Windows 上基本都用 TortoiseSVN。

svn 拉取代码并携带账号密码

svn checkout 相当于 git 的 clone,把仓库的某个路径拉到本地成为工作副本。不带凭据时会弹交互式提示要账号密码,在脚本或 CI 里跑不通,所以要用参数直接传:

把 your_name your_password 替换为对应的账号密码即可

svn checkout --username your_name --password your_password https://svn.test.com:8888

在命令行里明文写密码要留意两个风险:一是会留在 shell 历史记录里,二是同机器上其他用户能通过进程列表看到。放进脚本时建议从环境变量取值,或者干脆用 --config-option 让 svn 缓存凭据后续免密。另外自签证书的服务器第一次连接会问是否信任,非交互场景下加 --non-interactive --trust-server-cert 才能跑通。

几个和 git 对应的常用命令

从 git 过来的话,按这个对照关系记比较快:

svn update            # 相当于 git pull,拉服务器最新改动到工作副本
svn status            # 相当于 git status,看本地改了什么
svn diff              # 看具体改动内容
svn add <file>        # 新文件必须显式 add,否则 commit 时会被忽略
svn commit -m "msg"   # 直接提到服务器,没有本地 commit 这一步
svn revert <file>     # 撤销本地改动,恢复到基线版本
svn info              # 看当前工作副本对应的 URL 和修订版本

svn status 输出的首字母含义要清楚:M 是已修改,A 是已加入待提交,D 是待删除,? 是未纳入版本控制(相当于 git 的 untracked),! 是文件在版本库里但本地不见了。看到 ? 就要想到可能漏了 svn add——这是 SVN 最容易出的事故,新增的文件忘了 add,提交上去别人拉下来编译不过。

还有一点,SVN 里的「分支」本质上就是仓库里的一次目录拷贝,约定放在 branches/ 下,主干在 trunk/。切分支不是切换本地状态,而是重新 checkout 另一个路径,或者用 svn switch 把工作副本指到新 URL。这和 git 里轻量的分支概念差得远,所以 SVN 项目通常分支开得很少。

💬留言板0

还没有留言,来发表第一条吧~

PAGE LOAD / LIVESVN 常用命令:安装、拉取代码与带账号密码 checkout加载中