您当前的位置: 首页 > 

liaowenxiong

暂无认证

  • 1浏览

    0关注

    1171博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

SVN 命令详解

liaowenxiong 发布时间:2021-07-31 21:51:07 ,浏览量:1

文章目录
  • 在 SVN 服务端创建项目仓库,即资源仓库
  • 启动 SVN 服务器
  • 将客户端的源代码导入 SVN 版本库中
  • 从 SVN 服务器端检出代码到指定的客户端目录下
  • 从 SVN 版本控制器中导出指定版本的源代码到指定的客户端目录下
  • 更新指定版本的数据/回滚指定版本的数据/还原到指定版本的数据
  • 解决冲突
  • 清理工作副本
  • 查看/输出指定文件或 URL 的内容
  • 更新客户端的工作副本,即客户端数据
  • 显示文件每行的版本及作者信息
  • 提交更改过的代码到服务器
  • 只提交指定的文件或者目录到版本库中
  • 查看版本库的信息
  • 查看文件或者目录状态
  • 锁住文件让其它用户不能提交改动
  • 解开工作拷贝文件或者项目仓库 URL 的锁
  • 在工作副本或者资源仓库中创建包括历史在内的复本
  • 从版本控制中删除文件和目录
  • 查看日志
  • 比较差异
  • 将两个版本之间的差异合并到当前文件
  • 查看版本库下的文件和目录列表
  • 创建纳入版本控制下的新目录
  • 切换仓库地址
  • 移动或者重命名工作拷贝或者资源仓库中的文件或者目录
  • 删除文件或者目录的属性
  • 编辑文件或者目录的属性
  • 打印文件或者目录的属性值
  • 列出文件或者目录的所有属性
  • 给指定文件或者目录设置属性值
  • 往版本库中添加新的文件
  • 恢复客户端指定目录或者文件的修改
  • 查看 SVN 命令帮助

在 SVN 服务端创建项目仓库,即资源仓库

我要在 /Users/liaowenxiong/documents/svn-repo/ 目录创建一个名为 qpw 的仓库,命令如下:

svnadmin create /Users/liaowenxiong/documents/svn-repo/qpw

执行上述命令后,在 /Users/liaowenxiong/documents/svn-repo 目录下就多了一个子目录 qpw,同时目录 qpw 下面还有很多 SVN 自动创建的文件,如下图所示: 在这里插入图片描述 建议按产品线来创建资源仓库,因为一个产品线下会分多个项目,这样 SVN 服务端的『仓库-项目』结构正好与『产品线-项目』结构吻合了。

例如:公司其中一个产品叫 qpw,那么就创建一个名为 qpw 的仓库,在实际开发过程中,产品线 qpw 下面会有多个项目,那么就直接在 qpw 下创建多个目录代表多个项目,这些目录就是项目的根目录,在项目根目录下可以创建该项目的多个分支目录。

启动 SVN 服务器

输入以下命令启动 SVN 服务进程:

svnserve -d -r /Users/liaowenxiong/documents/svn-repo/qpw

-d 表示守护进程。 -r 表示在后台执行。

将客户端的源代码导入 SVN 版本库中

将客户端的某个文件导入到 SVN 服务器仓库中:

svn import /Users/liaowenxiong/desktop/123/122.png svn://localhost/Users/liaowenxiong/documents/svn-repo/qpw/image/122.png --username=lwx password=123 -m "上传图片"
# 如果 SVN 服务端与客户端都在本地主机上,SVN 服务端的仓库路径可以这样写
svn import /Users/liaowenxiong/desktop/123/122.png file:///Users/liaowenxiong/documents/svn-repo/qpw/image/122.png --username=lwx password=123 -m "上传图片"

客户端的文件122.png,上传到 SVN 服务端,要把服务端目标路径完整地写出来。如上的命令语句,仓库 qpw 下没有子目录 image,导入后会自动创建子目录 image,再创建文件122.png,然后再把从客户端读取到内存中的122.png的数据写入到 /Users/liaowenxiong/documents/svn-repo/qpw/image/122.png 中,就完成了文件导入的过程。

将客户端的某个目录下的所有文件导入到 SVN 服务器仓库中:

svn import /Users/liaowenxiong/desktop/image svn://localhost/Users/liaowenxiong/documents/svn-repo/qpw/image --username=lwx password=123 -m "上传图片"

客户端的目录 image 下所有的文件会导入到 SVN 服务端的 /Users/liaowenxiong/documents/svn-repo/qpw/image 目录下

注:

  1. 必须带上选项 -m,除非你设置了环境变量 SVN_EDITOR
  2. 导入指定文件时,SVN 服务端目标路径必须也是文件路径
从 SVN 服务器端检出代码到指定的客户端目录下
liaowenxiongdeMacBook-Air:test1 liaowenxiong$ svn checkout svn://localhost/Users/liaowenxiong/documents/svn-repo/qpw/ --username=lwx --password=123 /Users/liaowenxiong/desktop/test
A    /Users/liaowenxiong/desktop/test/image
A    /Users/liaowenxiong/desktop/test/image/122.png
A    /Users/liaowenxiong/desktop/test/image/123.png
A    /Users/liaowenxiong/desktop/test/image/lwx
A    /Users/liaowenxiong/desktop/test/image/lwx1
取出版本 8。

上面指定客户端的存放路径,则只是将 qpw 仓库目录下的内容导出到客户端目录 /Users/liaowenxiong/desktop/test 下,不包含 qpw 目录本身。如果你不指定客户端的存放路径,SVN 会把服务端 URL 指定的目录(被检出目录)及其内容一起检出到客户端的当前工作目录下,这是个坑。

liaowenxiongdeMacBook-Air:test liaowenxiong$ svn checkout svn://localhost/Users/liaowenxiong/documents/svn-repo
A    svn-repo/qpw
A    svn-repo/qpw/image
A    svn-repo/qpw/image/122.png
A    svn-repo/qpw/image/123.png
A    svn-repo/qpw/image/lwx
A    svn-repo/qpw/image/lwx1
取出版本 8。

其它: 1.checkout 可以简写成 co 2.检出的客户端目标目录如果是 unversioned,且里面含有与 URL 指定目录下的文件同名的文件,则不会覆盖客户端的同名文件,也就是跳过检出,即 SVN 版本库中的同名文件没有检出到指定的目标目录下,只是检出后整个目录及其它从 SVN 版本库检出的内容变成 versioned 而已,但是同名的客户端文件还是 unversioned 状态

从 SVN 版本控制器中导出指定版本的源代码到指定的客户端目录下

例如,回滚到第 9 版本,实际就是导出第 9 版本的源代码,命令如下所示:

svn export -r9 --force file:///var/www/svn_data/ecshop/ /home/ajia/html/ecshop/

注:

  1. /home/ajia/html/ecshop/:是客户端存放项目源代码的目录
  2. file:///var/www/svn_data/ecshop/:是项目的 SVN 版本库路径,此路径是客户端文件系统的路径格式。远程的 SVN 版本库路径通常是这样的:svn://47.104.51.164/var/www/svn_data/ecshop/
  3. 选项 -r 后面指定具体的版本号
更新指定版本的数据/回滚指定版本的数据/还原到指定版本的数据

将客户端版本库中的文件 test.java 还原到版本 20

svn update -r 20 test.java
解决冲突

提交的时候产生冲突了,可以执行命令 svn update 更新下客户端的数据,然后修改文件,接着执行命令 svn resolved 清除冲突标记,最后尝试再提交。

清除整个目录下的冲突标记:

lwxdeMacBook-Air:svntest lwx$ svn resolved -R .
“test2.txt”的冲突状态已解决

清除指定文件的冲突标记:

lwxdeMacBook-Air:svntest lwx$ svn resolved test4.txt
“test4.txt”的冲突状态已解决
lwxdeMacBook-Air:svntest lwx$ svn ci -m 测试
正在替换       test4.txt
传输文件数据.done
正在读取事务
提交后的版本为 66。

注:

  1. 往往是整个目录的内容有冲突,所以清除冲突标记时要指定目录,才能真正清除冲突标记
  2. 选项 -R 是无穷递归
  3. 此子命令不在语义上解决冲突或删除冲突标记;它只删除与冲突相关的工件文件,并允许再次提交路径。它已被弃用,转而运行 svn resolve --accept working
清理工作副本

恢复因为中断操作而处于锁定状态的工作副本,或删除不需要的文件。

svn cleanup path
查看/输出指定文件或 URL 的内容

如果指定了版本,将从指定的版本开始查找:

svn cat -r PREV filename > filename  # PREV 是上一版本,也可以写具体版本号,这样输出结果是可以提交的

查看 SVN 服务端版本库中指定文件的内容:

lwxdeMacBook-Air:svntest lwx$ svn cat svn://47.104.81.224/Documents/需求文档/test2.txt
更新客户端的工作副本,即客户端数据

例如,我想更新目录 /var/www/qpw/miniprogram/ 下的代码,则需要先进入该目录下,然后执行更新命令:

svn update

注:

  1. update 可以简写成 up
  2. 更新的时候,SVN 有根据路径映射表去查找客户端文件,所以原来在 versioned 的文件如果被 SVN 以外的命令删除,会提示文件已被恢复
  3. 更新客户端数据时,若存在 unversioned 的同名文件时,SVN 会报告冲突,并给出解决冲突的选项,你可以根据自己的需求选择后继续
  4. 如果客户端数据的版本和你要更新的 SVN 服务端版本相同,则不会从 SVN 服务端获取数据更新到客户端
显示文件每行的版本及作者信息
svn blame

可以指定版本,如果指定的 rev 是单个版本,显示该版本作者信息。

svn blame --revision rev

如果指定的是一个版本范围 rev1:rev2,则显示 rev2 版本作者的信息,但只检查版本到 rev1

svn blame --revision rev1:rev2

注:选项 --revision 可以简写成 -r

提交更改过的代码到服务器

你将 miniprogram 目录下的代码修改了,你现在想将 miniprogram 目录下的最新代码提交到 SVN 服务器对应的目录下,你必须先进入到 miniprogram 目录下,然后执行提交命令:

cd /var/www/qpw/miniprogram/
svn commit -m "修改了main.m文件"
svn ci --file ARG # 从文件ARG读取日志信息

注:

  1. 提交修改到 SVN 服务器,也可以描述为同步修改的内容到 SVN 服务器,提交也可以理解为 Check In(检入),为了保证客户端的数据与 SVN 服务器的数据同步,要养成经常 update 的习惯,而且最好在提交之前先 update 客户端的数据再提交
  2. commit 可以简写成 ci
  3. 提交之前最好要更新下,因为如果其他人也修改了相同位置的代码,你可以提前更新下来手动处理冲突,然后提交就可以顺利通过了,当然你非要提交后产生冲突再解决也可以,但是这不是好的习惯
  4. 可以使用选项 --no-unlock,表示不要在提交的时候释放锁
  5. 提交命令不能指定 URL,但是可以指定 PATH,而且只能提交处于 versioned 状态的目录下的内容
只提交指定的文件或者目录到版本库中

svn commit 后面可以附加参数指定文件路径:

svn commit /Users/lwx/Documents/workspace/miniprogram/Person.java -m "改了啥"

注意:受版本控制的路径名称大小写敏感

查看版本库的信息

你需要在客户端进入受 SVN 管控的目录下后再输入下面的命令:

lwxdeMacBook-Air:htlwk_SVN lwx$ svn info
路径: .
工作副本根目录: /Users/lwx/Documents/qpw
URL: svn://13.789.09.777/Documents
Relative URL: ^/Documents
版本库根: svn://13.789.09.777
版本库 UUID: 67c9418b-eafe-4073-b855-d64970bfc5b8
版本: 47
节点种类: 目录
调度: 正常
最后修改的作者: lcz
最后修改的版本: 47
最后修改的时间: 2021-07-18 13:58:35 +0800 (日, 2021-07-18)
查看文件或者目录状态

显示目录下的文件和子目录的状态,正常状态不显示。

svn status path

说明:

标识符说明?不在svn的控制中M内容被修改C发生冲突A预定加入到版本库K被锁定

使用 -v,打印每个项目的完整修订信息:

lwxdeMacBook-Air:htlwk_svn lwx$ svn -v status
                47       47 lcz          .
                47       47 lcz          设计文档
                47       47 lcz          设计文档/xxx概要设计 - 小程序端分册.docx
                47       43 lcz          设计文档/xxx概要设计 - 总册.docx
                47       47 lcz          设计文档/xxx概要设计 - 管理后台端分册.docx
                47       43 lcz          设计文档/xxx.pdb
                47       43 lcz          设计文档/xxx.pdm
                47        1 lcz          设计文档/xxx数据模型.docx
                47       43 lcz          设计文档/xxx数据模型.rtf
                47       23 lwx          需求文档
                47       23 lwx          需求文档/企评网UI设计稿_小程序
                47       23 lwx          需求文档/企评网UI设计稿_小程序/PSD

注:

  1. 第二列表示最后一次修改的版本号,第三列表示最后一次的修改人
  2. svn statussvn diffsvn revert 这三条命令在没有网络的情况下也可以执行的,原因是 SVN 在客户端的 .svn 中保留了客户端版本的原始拷贝
  3. status 可以简写成 st
  4. 如果没有参数,则仅打印客户端修改的项目(无网络访问)
锁住文件让其它用户不能提交改动
svn lock target

注:

  1. 使用选项 --message–m 指定锁消息
  2. --force 偷锁,即强制加锁,通过从其他用户或者工作拷贝把锁给偷过来,没有明白,为啥要偷锁,难道只有一把锁吗?
解开工作拷贝文件或者项目仓库 URL 的锁
svn unlock target…

注:--force 砸坏现有对 target 的锁,甚至它不是被当前工作拷贝所拥有的

在工作副本或者资源仓库中创建包括历史在内的复本
svn copy src dest

说明: src 和 dest 可以是工作拷贝(WC)的路径或者 URL。

  1. WC WC 拷贝并添加
  2. WC URL 立即提交 WC 的拷贝到 URL
  3. URL WC 签出 URL 到 WC,即添加
  4. URL URL 完全服务器端拷贝;用于制作分支和打标签
  5. --revision rev–r rev 指定要拷贝的 src 的版本。只在 src 是服务端仓库的 URL 时才有意义
从版本控制中删除文件和目录

直接删除 SVN 服务端版本库的文件:

svn delete svn://192.168.1.1/pro/domain/test.java -m “delete test file”

或者先删除客户端版本库的文件,然后再提交到 SVN 服务端,推荐使用这种方式:

svn delete test.java 
svn ci -m "delete test file"

注:delete 可以写成 delremoverm

查看日志

查看文件 test.java 的所有修改记录,及其版本号的变化:

svn log test.java
比较差异

将修改的文件 test.java 与其基础版本比较:

svn diff test.java

如果要查看特定修订版(即修订版1)的确切不同行,只需键入:

svn diff -r 1

同一个文件的两个版本进行差异比较,例如文件 test.java 的版本 200201 之间进行差异比较:

svn diff -r 200:201 test.java

注:diff 可以简写成 di

将两个版本之间的差异合并到当前文件

将文件 test.java 的版本 200205 之间的差异合并到当前文件,但是一般都会产生冲突,需要处理一下。

svn merge -r 200:205 test.java
查看版本库下的文件和目录列表

可以查看客户端版本库下的文件和目录,例如显示 path 目录下的所有属于版本库的文件和目录:

svn list path

也可以查看 SVN 服务端某个指定目录下的内容,不过需要输入远程主机操作系统 root 用户的登录密码以及 SVN 服务器资源仓库的登录用户名和密码。

svn list svn://47.104.53.284/SourceCodes/miniprogram

注:list 可以简写成 ls

创建纳入版本控制下的新目录
svn mkdir PATH
svn mkdir URL
svn mkdir svn://57.104.99.388/Documents/需求文档/svntest2 -m "创建目录svntest2"
  1. 每一个以工作副本 PATH 指定的目录,都会创建在客户端端,并且加入新增调度(新增计划 schedule),以待下一次的提交。
  2. 每个以 URL 指定的目录,都会立即提交于仓库中创建。
  3. 在这两个情况下,所有的中间目录都必须事先存在。
切换仓库地址

改写工作副本的 URL 元数据,以反映单纯的 URL 的改变。当仓库的根 URL 变动(比如方案名或主机名称变动),但是工作副本仍旧对应到同一仓库的同一目录时使用这个命令更新工作副本与仓库的对应关系。

svn switch --relocate  
# 或者
svn relocate FROM-PREFIX TO-PREFIX [PATH]
移动或者重命名工作拷贝或者资源仓库中的文件或者目录

请注意,在Subversion不知道的情况下,决不能从工作副本中删除或重命名文件。您可以在文件中随意修改。但是,如果您只是重命名文件或将其移动到另一个文件夹,Subversion将丢失对它们的跟踪。对于这些操作,请始终使用“svn”命令。

svn move src dest
svn move oldfilename newfilename
svn commit -m "moved file"
删除文件或者目录的属性
svn propdel propname path

注:propname 是属性名

编辑文件或者目录的属性
svn propedit propname path
打印文件或者目录的属性值
svn propget propname path

注:--strict 禁用额外的换行和其它的美化措施(在把二进制属性重定向到文件时会有用处)

列出文件或者目录的所有属性
svn proplist

注:

  1. --verbose
  2. --recursive
  3. --revision rev 列出 path 在版本 rev 定义的属性
给指定文件或者目录设置属性值
svn propset propname propval path…

注:

  1. --file file 读取 file 的内容,使用它作为属性值
  2. --recursive
  3. --encoding enc 指定属性值的字符编码集
  4. propset 可以简写成 psetps
往版本库中添加新的文件
svn add test.java
svn add *.java # 将当前目录下所有的 java 文件添加到 SVN 版本库中

这里只是把文件添加到客户端的版本库中,SVN 服务端的版本库中并没有此文件,你需要提交到服务端保持同步

svn commit -m "added new file"

如果文件名含有符号 @ 需要特别处理:

svn add xxx@2x.png 

执行上述命令会报 xxx not found,可以在文件名后面加上 @,如下所示:

svn add xxx@2x.png@  

这是因为 svn 命令使用 @ 符号来指定一个版本号,所以会将最后一个 @ 前面的字符串解释为文件名。

恢复客户端指定目录或者文件的修改

将指定目录或者文件恢复到改变前的状态,只能恢复客户端版本库的数据,但是它不会恢复被删除的文件。

svn revert PATH
查看 SVN 命令帮助

你可以使用选项 -?-h--help 来查看 SVN 总命令的帮助信息:

lwxdeMacBook-Air:htlwk_SVN lwx$ svn -?
usage: svn  [options] [args]
Subversion command-line client.
Type 'svn help ' for help on a specific subcommand.
Type 'svn --version' to see the program version and RA modules,
     'svn --version --verbose' to see dependency versions as well,
     'svn --version --quiet' to see just the version number.

Most subcommands take file and/or directory arguments, recursing
on the directories.  If no arguments are supplied to such a
command, it recurses on the current directory (inclusive) by default.

Available subcommands:
   add
   auth
   blame (praise, annotate, ann)
   cat
   changelist (cl)
   checkout (co)
   cleanup
   commit (ci)
   copy (cp)
   delete (del, remove, rm)
   diff (di)
   export
   help (?, h)
   import
   info
   list (ls)
   lock
   log
   merge
   mergeinfo
   mkdir
   move (mv, rename, ren)
   patch
   propdel (pdel, pd)
   propedit (pedit, pe)
   propget (pget, pg)
   proplist (plist, pl)
   propset (pset, ps)
   relocate
   resolve
   resolved
   revert
   status (stat, st)
   switch (sw)
   unlock
   update (up)
   upgrade

Subversion 是版本控制工具。
欲取得详细资料,请参阅 http://subversion.apache.org/

你也可以使用 svn help commit 或者 svn commit -? 查看某个子命令的使用说明:

lwxdeMacBook-Air:htlwk_SVN lwx$ svn commit -?
commit (ci): Send changes from your working copy to the repository.
usage: commit [PATH...]

  A log message must be provided, but it can be empty.  If it is not
  given by a --message or --file option, an editor will be started.

  If any targets are (or contain) locked items, those will be
  unlocked after a successful commit, unless --no-unlock is given.

  If --include-externals is given, also commit file and directory
  externals reached by recursion. Do not commit externals with a
  fixed revision.

有效选项: 
  -q [--quiet]             : 不打印信息,或只打印概要信息
  -N [--non-recursive]     : obsolete; same as --depth=empty
  --depth ARG              : 限制操作深度是 ARG ('empty', 'files',
                             'immediates', 或 'infinity')
  --targets ARG            : 传递文件 ARG 内容为附件参数
  --no-unlock              : 不要解锁目标
  -m [--message] ARG       : 指定日志信息ARG
  -F [--file] ARG          : 从文件ARG读取日志信息
  --force-log              : 强制校验日志信息资源
  --editor-cmd ARG         : 使用 ARG 作为外部编辑器
  --encoding ARG           : 将ARG的值视为字符编码
  --with-revprop ARG       : 在新版本设置版本属性 ARG
                使用格式 name[=value]
  --changelist [--cl] ARG  : 只能对修改列表 ARG 的成员操作
  --keep-changelists       : 不要在提交后删除修改列表
  --include-externals      : also operate on externals defined by
                             svn:externals properties

(Use '-v' to show global and experimental options.)
关注
打赏
1661566967
查看更多评论
立即登录/注册

微信扫码登录

0.0444s