SVN 笔记

作者: 溪水清澈

Tortoise是配合资源管理器用的.

 

svn 命令行客户端程序。

svnversion

显示工作拷贝的状态(用术语来说,就是当前项目的修订版本)。

svnlook直接查看Subversion版本库的工具。

svnadmin建立、调整和修复Subversion版本库的工具。

svndumpfilter过滤Subversion版本库转储数据流的工具。

mod_dav_svn ApacheHTTP服务器的一个插件,使版本库可以通过网络访问。

svnserve一个单独运行的服务器程序,可以作为守护进程或由SSH调用。这是另

一种使版本库可以通过网络访问的方式。

svnsync 一个通过网络增量镜像版本库的程序。版本库历史复制.

 

每更新一项就输出一行信息,使用首字符来报告执行的动作。这些字符的含义是:

 

  A  已添加

  D  已删除

  U  已更新

  C  合并冲突

  G  合并成功

  E  已存在

 

全局选项:

  --username ARG           : 指定用户名称 ARG

  --password ARG           : 指定密码 ARG

  --no-auth-cache          : 不要缓存用户认证令牌

  --non-interactive        : 不要交互提示

  --trust-server-cert      : 不提示的接受未知的

SSL服务器证书(只用于选项 “--non-interactive”)

  --config-dir ARG         : 从目录 ARG 读取用户配置文件

  --config-option ARG      : 以下属格式设置用户配置选项:

                                 FILE:SECTION:OPTION=[VALUE]

     例如:

     servers:global:http-library=serf

 

    • 日志

    -m 或 --message "日志内容"

    一定要用双引

 

    • svn checkout 远程目录 本地目录

    目录对目录的copy

    列表中的A表示Subversion增加了一些条目到工作拷贝

 

表 1.1. 版本库访问URL

模式访问方法

file:/// 直接版本库访问(本地磁盘)(注意是三个/)

http://通过配置Subversion的Apache服务器的

WebDAV协议

https://与http://相似,但是包括SSL加密。

svn://通过svnserve服务自定义的协议

svn+ssh://与svn://相似,但通过SSH封装。

 

    • svn import 本地目录 远程URL

    把本地目录导入到远程 版本库中,

    但是本地目录不进行版本化.

    如果想版本化, 还需要svn checkout

 

  • svn checkout 远程url 本地目录

本地目录可以不写,

如果不写, 则会把远程的代码库目录名, 当成本地目录.

 

  • svn commit . --username yf -m "commit log"

使用yf用户提前当前目录, 日志为 commit log

 

  • svn add foo

把foo添加到目录树中,

如果foo是一个目录, 会把foo下的所有文件都添加进去,

如果不想添加目录foo下的文件, 使用参数 -N 或 --non-recursive

 

  • svn delete foo
  • svn copy foo bar
  • svn move foo bar
  • svn mkdir dir_a

以上四个命令可以把foo换成 URL 地址, 表示直接操作版本库

只操作版本库, 不在本地创建.

  • svn status 目录或文件

哪些文件被修改了

如果不带目录, 只显示当前目录及子目录下, 哪里被修改了

  • svn status -v verbose

显示当前copy的status, 与本地版本库比较

  • svn status -u //update

显示当前copy的status, 与服务器版本库对比

如果信息有 * 星号, 表示服务器版本较新

预测冲突

  • svn revert

svn revert 文件 -r 版本号

恢复文件到 版本号

  • svn log 展示给你主要信息:每个版本附加在版本上的作者与日期

信息和所有路径修改。

svn log -r 3:5

升序显示日志, 从版本3 - 版本5

svn log -v

显示详细信息

  • svn diff 显示特定修改的行级详细信息。

svn diff -r 4:5

比较R4和R5两个版本

只是比较两个路径, 而非比较同一个对象的不同版本

  • svn diff -c 3

<==> svn diff -r 2:3 与前一个版本比较

显示范围为: 变化的行 + 前后三行

 

  • svn cat 取得在特定版本的某一个文件显示在当前屏幕。

svn cat -r 2 readme.txt

显示R2中的readme.txt

  • svn list 显示一个目录在某一版本存在的文件。

不下载文件, 显示库内容.

注: 此命令是显示服务器上的内容, 而不是本地的.

显示本地, 请使用: dir, ls 等等.

svn list -R

递归显示

  • svn export 版本库URL

导出版本库, 但不创建.svn目录

  • svn cleanup

递归清理工作副本,删除锁,继续未完成操作,等等。

如果svn的工作被意外中断了,

比如死机, 断电 等等,

这个命令会继续执行上次未完成的任务, 并清理任务日志.

 

版本号: 不区分大小写

  1. 数字
  2. HEAD 版本库中最新的(或者是“最年轻的”)版本。

BASE 工作拷贝中一个条目的修订版本号,如果这个版本在本地修改了,则“BASE版本”就是这个条目在本地未修改的版本。

COMMITTED项目最近修改的修订版本,与BASE相同或更早。

PREV一个项目最后修改版本之前的那个版本,技术上可以认为是COMMITTED -1

 

    • svn log -r head:prev

    显示最新版本和上一版的日志

     

    • svn checkout -r {2006-02-17T15:30}

    接近指定时间的版本

    如果不指定时分秒, 按 0:0:0 算

 

    • svn blame 文件

    此文件中, 第一行都是在哪个版本中添加或修改的.

 

  • 属性名可以是 字母, 数字, 减号, 点号

    • svn propset 属性名 "属性值" (如果需要引号, 一定是双引号)
    • svn propset 属性名 "属性值" -R 目录

    递归的对此目录下所有文件设置属性

    • svn propedit 属性名

    如果提示什么变量没设置, 可以使用 set 变量名=值 来设置

     

    • svn proplist *

    可以列出所有文件的属性名, 只是属性名, 不带值的

    • svn proplist * -v

    名称和值都列出.

 

  • 忽略:

    目录属性名: svn:ignore

    不是正则, * 代表多个

     

    • svn:needs-lock

    把文件变只读,

    当编辑之前, 会要求先锁定文件

    • svn:externals属性

    此属性可以使得在update 某个版本库时, 把别的版本库包含到当前目录下

    例:

    svn propedit svn:externals .(点表示当前目录)

    在弹出的编辑器中输入如下:

    MyR1   https://s.com/svn/r1

    就会把版本库r1 中的数据, 更新到当前目录下的目录MyR1中

     

    当然, 定义了属性以后, 要commit, 别的用户在checkout时, 才会有效

     

    貌似程序实现的不是很好, 建议不要使用.

    • svn:mime-type

    此属性会在浏览器中浏览库中的文件时, 生效,

    浏览器会按这个值来渲染文件

 

  • 关键字:

注: 关键字区分大小写, 直接修改关键字这一行, svn认为文档没有修改

别名和关键字意义相同,

在svn:keywords(区分大小写)在, 别名和正名都可以使用.

在svn:keywords中, 手册说以空格分割关键字,

实际上应该是空白, 包括 空格 \t \n

$Date::              $ 可以限制关键字的最大长度

 

Date: $Date:2013-02-28 14:33:20 +0800 (周四, 2013-02-28) $

LastChangedDate:$LastChangedDate: 2013-02-28 14:33:20 +0800 (周四, 2013-02-28) $

Revision:$Revision: 34 $

LastChangedRevision:$LastChangedRevision: 34 $

Rev: $Rev: 34 $

Author: $Author: hy$

LastChangedBy:$LastChangedBy: hy $

HeadURL: $HeadURL: https://s.com/svn/news/readme.txt$

$URL: https://s.com/svn/news/readme.txt$

Id: $Id: readme.txt31 2013-02-28 06:29:01Z hy $

 

    • svn lock 文件

    锁定文件

    • svn lock 文件 --force

    即使别人已锁定, 也可以获得锁

    • svn status -u

    查看版本库的更新信息, 第六列

    O

    锁定(Other)

    T

    (偷)被窃取

    B

    打破(Broken)

    K

    表示被锁定

    X

    eXternals

    • svn info 文件(* 表示所有文件 )

    显示详细信息

    • svn info URL

    可以显示目前谁锁定了文件

    • svnadmin lslocks 库路径(非URL)

    显示库下所有锁, 可多个

 

  • Rev和Peg

Rev: 实施的修订版本, 表示当前文件在某个版本的内容

Peg: 中文名未知, 表示当前路径在某个版本的样子

举例如下:

在Rev1有个文件叫index.html, 内容为: index at rev1

在Rev2时, 删除了index.html: svn delete index.html

在Rev3时, 我们又添加了一个 index.html, 内容为: index.added at rev3

此时, 如果我们想查找 在 Rev1时, 文件名为index.html的文件内容如何?

svn cat index.html@1  // 定位到 路径在版本1时的对象

结果为: index at rev1

svn cat -r 1 index.html  //定位到当前面对象,

//回溯到版本1时, 当前对象是什么样子

结果为: 报错, 因为当前对象在Rev1时不存在.

 

svn cat-r Rev Path@Peg

意思为: 在Peg版本中, Path路径所表示的对象 在 Rev中 的内容

 

    • 使用协议

    svn --version

    会显示本版本svn可以使用什么协议与服务器通讯

 

    • 密码缓存

    C:\Users\IceWindYoung\AppData\Roaming\Subversion\auth\svn.simple

 

    • 创建分支:

    直接复制原有文件即可, 当然是svn copy 而非操作系统的复制

    如:

    svn copy trunk branch\new-trunk

    svn https://s.com/svn/repo1/trunk https://s.com/svn/repo1/branch/new-trunk

    复制并不是真实的复制文件, 而是增量复制.

    Subversion并没有内在的分支概念—只有拷贝,

    当你拷贝一个目录,这个结果目录就是一个“分支”,

    只是因为你给了它这样一个含义而已。

    • 合并分支

    svn merge -c M,N 源URL 工作copy

    把 源URL 从 版本M到N的变化 合并到 工作copy中

    • 在版本控制术语中,这种在分支之间拷贝修改的行为叫做搬运修改。
    • svn merge 合并时会时会注意到两个文件有没有共同的祖先,

    如果有, 才进行行比较, 然后合并内容,

    但如果加上参数: --ignore-ancestry 则直接按路径比较,

 

    • 迭代恢复(svn revert --recursive)
    • svn log --stop-on-copy

    查找日志, 到 分支建立时, 因为copy就是建分支

 

    • 分支合并到主干:
    1. 在分支中, 查看分支建立版本, 以前分支当前版本

    svn log -v --stop-on-copy

    1. 目录转到主干中: cd 主干目录
    2. svn merge -r 分支建立版本:分支当前版本 分支的URL

    把分支从建立到当前的变化加入到主干.

    • 全并分支中 新的内容
    1. 在主干中, 查看上一次合并的版本, 定为 LastMergeRev
    2. 在主干目录中, 执行:

    svn merge -r LastMergeRev:Head 分支URL

     

    • 反向合并

    只要在指定版本时, 左版本大于右版本即可.

    svn merge -r 30:29 版本库URL

    会把修改变到29

 

    • 找回删除的项目
    1. 先找到 所要找回的对象 所在的版本
    2. svn copy -r 版本 对象URL 对象本地文件名

 

    • svn switch 分支URL

    和svn update的区别

    svn switch 把当前目录的 URL改为 分支URL, 并更新

    svn update 只是更新

 

    • 标签: 最终发布的版本, 版本库在某一个时刻的快照

    建立方式同 建立分支, 也是copy, 注意日志说明

    标签的产生过程与建立分支是一样的?

    是的,实际上在Subversion中标签与分支没有区别,都是普通的目录,

    通过copy命令得到,

    与分支一样,一个目录之所以是标签只是人们决定这样使用它,

    只要没有人提交这个目录,它永远是一个快照,

    但如果人们开始提交,它就变成了分支

    • 可以copy本地目录到URL库中, URL库路径的最后一级目录可以自动创建,

    前面的目录需要已存在.

    • 如果你在trunk做了半天工作, 但是突然发现, 你也许应该在分支中做这些工作?

    如果保存已做的工作, 并切换到分支中?

    1. svn copy https://s.com/svn/zhut/trunk https://s.com/svn/zhut/branch/newbranch
    2. svn switch https://s.com/svn/zhut/branch/newbranch

    已在trunk上做的工作, 会被保存.

 

    • 供方分支

    使用目录 /vendor

    1. 建立供方drop
    2. 建立供方标签
    3. 复制标签到trunk
    4. 当供方更新时,
    5. 重建供方drop
    6. 把供方标签到供方drop合并到trunk

    svn merge https://...供方drop https://...供方标签 当前copy

    • 管理版本库

    一库多项目, 缺点是我没修改, 但Rev依然在增加.

    一库一项目,

    混合(把相关项目组合成一个库)

    • 目录布局

    什么样的都可以, 对SVN来说, 目录就是目录, 没有别的意义.

    注意: 听取一个项目参与者的意见.

 

    • 后端

    后端就是版本库的储存方式, 包括BDB数据库和 FSFS文件

 

    • svnlook youngest /path/to/repo

    显示最大版本号.

    • svnlook author 作者
    • svnlook changed 库路径(非URL)

    显示版本库路径的改变

    • svnlook diff

 

    • svnadmin setlog myrepos newlog.txt -r Rev

    在服务器端设置日志

    • svnadmin lstxns myrepos

    列出未提交的事务

    • svnadmin rmtxns myrepo

    删除未提交的事务

    • svnadmin dump 版本库本地路径 >> 版本库导出储存文件
    • svnadmin load 版本库本地路径(要由svnadmin create初始化) < 转储文件
    • 或者:

    svnadmin dump 路径 | svnadmin load 新路径

    • 多文件转储

    svnadmin dump myrepos -r 0:1000 > dumpfile1

    svnadmin dump myrepos -r 1001:2000 --incremental > dumpfile2

    svnadmin dump myrepos -r 2001:3000 --incremental > dumpfile3

    • 转储过滤, 就是版本库删除

    svndumpfilter include 要留下的路径前缀( 应该是相对于根的 相对路径 )

    exclude 不包含的路径前缀

    • 热备份

    svnadmin hotcopy /path/to/repos /path/to/repos-backup

 

    • 建立服务器:

    windows进程

    sc create SvnServiceName binpath= "svnserve --service"

    • 配置文件, svnserve.conf

    password-db 控制用户的整体权限

    authz-db 控制用户对某个目录的权限

    realm 登录时的提示信息

    如果用户想访问某个版本库中的某个对象, 必须满足所有 授权 规则

 

    • svn 和 apache

    失败,  因为在apache上, LoadModule失败,

    所以手册内容, 无法理解.

    • 创建日志, 未测试.

    CustomLog logs/svn_logfile "%t %u %{SVN-ACTION}e" env=SVN-ACTION

 

    • 配置文件:

    Win7: C:\Users\IceWindYoung\AppData\Roaming\Subversion

    此目录在Win7中用常量 %APPDATA% 表示

    如果对配置文件不满, 把这个目录删掉,

    再随便运行个svn命令即可, 如: svn --version

     

    • 配置文件例子

    [HKEY_LOCAL_MACHINE\Software\Tigris.org\Subversion\Servers\global]

    "#http-proxy-host"=""

    "#http-proxy-port"=""

    "#http-proxy-username"=""

    "#http-proxy-password"=""

    "#http-proxy-exceptions"=""

    "#http-timeout"="0"

    "#http-compression"="yes"

    "#neon-debug-mask"=""

    "#ssl-authority-files"=""

    "#ssl-trust-default-ca"=""

    "#ssl-client-cert-file"=""

    "#ssl-client-cert-password"=""

    [HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\auth]

    "#store-passwords"="yes"

    "#store-auth-creds"="yes"

    [HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\helpers]

    "#editor-cmd"="notepad"

    "#diff-cmd"=""

    "#diff3-cmd"=""

    "#diff3-has-program-arg"=""

    [HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\tunnels]

    [HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\miscellany]

    "#global-ignores"="*.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#* .DS_Store"

    "#log-encoding"=""

    "#use-commit-times"=""

    "#no-unlock"=""

    "#enable-auto-props"=""    //yes | no

    [HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\auto-props]

    *.txt = svn:keywords=Id  //给所以有txt文件添加关键字属性

    • servers文件

    [groups]

    组名 = 带通配符的主机名   //表示此主机名的访问权限由相应的组名来控制

    [组名]

    访问权限

    [global]

    未在groups段中匹配的主机由此处设置

     

     

    • 汉化包位置

    D:\Program Files\Subversion\share\locale

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SVN(Subversion)是一个版本控制系统,它可以帮助团队协作开发和管理项目的代码。在使用SVN之前,你需要先创建一个版本库(Repository),然后才能在该版本库中进行代码的版本控制。 要创建一个SVN版本库,你可以按照以下步骤进行操作: 1. 安装SVN服务器:首先,你需要在你的服务器上安装SVN服务器软件。常用的SVN服务器软件有Apache Subversion(简称Apache SVN)和VisualSVN Server等。你可以根据自己的需求选择合适的SVN服务器软件进行安装。 2. 配置SVN服务器:安装完成后,你需要进行SVN服务器的配置。具体配置方式会因不同的SVN服务器软件而有所不同,但通常需要指定版本库的路径、访问权限等信息。 3. 创建版本库:在SVN服务器配置完成后,你可以使用SVN客户端工具来创建版本库。SVN客户端工具有很多种,比如TortoiseSVN、SmartSVN等。这里以TortoiseSVN为例进行介绍。 - 下载并安装TortoiseSVN:首先,你需要下载并安装TortoiseSVN客户端工具。你可以在TortoiseSVN官方网站上下载最新版本的安装包,并按照安装向导进行安装。 - 创建版本库:安装完成后,在你想要创建版本库的目录上,右键点击鼠标,选择"TortoiseSVN",然后选择"Create Repository here"。接着,选择版本库的类型(如标准文件系统、Berkeley DB等),并指定版本库的名称和路径。 4. 配置访问权限:创建版本库后,你可能需要配置访问权限,以控制谁可以对版本库进行读写操作。具体的权限配置方式也会因SVN服务器软件而有所不同,你可以参考相应的文档进行配置。 至此,你已经成功创建了一个SVN版本库。接下来,你可以使用SVN客户端工具来进行代码的版本控制、提交修改等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值