Subversion:版本控制_subversion 版本控制-程序员宅基地

技术标签: subversion  服务器  svn  软件开发bizaar  存储  工作  tortoisesvn  

subversion安装使用流程
http://blog.csdn.net/ladofwind/archive/2008/02/17/2100200.aspx
subversion官网
http://subversion.apache.org

Subversion安全点滴

http://www.linuxfly.org/post/450/

linux下:svnserve + ssl
http://articles.slicehost.com/2007/9/5/using-ssh-with-svnserve
window下apache+subversion+ssh
http://bbs.iusesvn.com/thread-158-1-1.html

 

 

 

版本控制的基本哲学:易用、直观、轻量。

组织你的项目仓库
无论是一个项目还是多个项目,牢记:在Subversion中,“万事皆目录”
对于一个项目,可建立三个目录:

/trunk作为主要的开发区域;

/tags用来存储标签;

/branches用来存储分支。

创建项目
项目的共同特征:
·每个项目都有名字
·每个项目都是内聚的;项目的组件一起达成一些业务目标
·项目内的组件倾向于作为单元来维护;你要把项目的一个版本作为整体来发布
·项目中的参与人员遵守同一套工程标准和规范,并且使用共同的架构

Subversion使用目录来组织所有的东西,因此一个项目将对应于项目仓库中一个目录的位置。
创建初始项目的两种方式:
1、把现有文件导入
2、手工创建目录,设计目录结构(svn mkdir命令)

 

 

以下内容来自《版本控制之道》,作者mike mason

Subversion

一个特性:原子提交和改动集
Subversion使用了类似数据库事务的方式来处理用户提交代码到项目仓库的过程。
整个改动过程要么成功地被提交要么被中断并回滚。当某人正在提交的时候,其他人是看不到不完整的改动的,你看到的要么是改动之前的状态,要么是改动之后的状态。这样的行为被成为“原子提交”。
原子提交过程的其中一步就包括把你所有的改动打包成为一个“修订集”,并且给这个改动标记一个修订号。由于对多个文件的所有改动被打包为单一的逻辑单元了,程序员可以更好地组织和跟踪他们所做过的改动。

在项目仓库中存储什么
版本控制系统是一个当你在开发一个程序时储存你写的东西的所有修订版本的地方,不仅只限于源代码。
事实上,要决定放什么不放什么有一个很简单的测试。只要问问你自己“如果我们没有这个东西的最新版本,我们是不是可以构建、测试并交付我们的程序?”。
存储任何对项目有贡献的东西。

项目仓库与工作拷贝
项目仓库存储了我们项目需要的所有文件,但是光存着还没用,我们要给程序添加功能时该怎么办呢?我们需要把文件放在我们能够修改它们的地方,这个地方被成为我们本地的“工作拷贝”。
工作拷贝是一个我们完成项目当前任务时所需要的一切东西的本地拷贝,内容都是从项目仓库获取而来的,可能是全部,也可能只是项目代码的一个子集。

签出与导出
签出:当你从项目仓库签出一些东西时,就是把文件复制一份到你的工作拷贝。
导出:当你导出的时候,你得到的不是一个工作拷贝,而只是一个项目仓库文件的快照。

Subverison“万事皆目录”
Subversion以目录的形式组织项目仓库
一个项目可能对应的是一个顶层的目录,模块和子模块则是你项目中的目录。此外,Subversion也支持“外部引用”(一个外部引用就是把另一个Subversion项目仓库的位置包含到你项目的任何目录中)。

Subversion的版本号
Subversion的是全项目仓库的编号方式(即项目仓库整体方式,不同于CVS使用的具体文件编号方式),因此不是用来表明某个文件或者某些文件改动了多少,而是像马克笔,在每次提交的时候给项目仓库的所有文件画一条线。版本号是针对整个项目仓库而言的。

项目主干和分支
分支有点像科幻故事中常见的那种设备,在这种设备中发生某种事件后会导致时间分裂。从那时往后,就会出现两个平行的将来。当另外某种事件发生时,又会导致这些未来再次分裂。很快,你就要面对大量平行的宇宙了。
分支几乎就是一个完全独立的项目仓库:使用这个分支的人们可以看到它包含的代码并独立地进行操作,不会影响到工作在其他分支或主干上的人。每个分支都有自己的历史记录。
分支在Subversion中是以命名目录的形式存储的。创建一个分支只需简单地把主干拷贝到一个新的位置。Subversion内部的“延迟拷贝”实现方式使拷贝过程高效,同时也是Subversion对代码打标签功能的基础。当你拷贝了一个文件或目录时,Subversion只是拷贝了指向原始文件的链接,当你对拷贝做了修改时,Subversion把修改记录为相对原始文件的修改。使用延迟拷贝,Subersion可以非常快地拷贝一大批文件而且几乎不占用空间。
但记住,应该避免过度的分,只做必须要做的事情。

合并
版本控制系统支持“合并”。比如说你在发布版本分支中修正了一个bug并且意识到同样的bug在主干代码中也存在。你可以让版本控制系统找出你为了修正这个bug在发布版本分支上做了哪些改动,然后把这些改动应用到主干代码上。



访问项目仓库:三种网络协议
1、svn
Subversion自带了sunserve,一个监听网络连接的小服务器,支持简单的用户认证。
命令示例
svn co svn "repos-URL" "workMenu"
2、svn+ssh
单独使用svn具有安全隐患(一是文件内容是以明文形式传输的;二是密码是以明文方式存储在服务器的conf目录中)。
可以通过Secure Shell(SSH)来解决这两个问题。
要使用svn+ssh:
(1)需要先安装ssh客户端(putty是一个很好的ssh客户端;此外,使用TortoiseSVN不用担心ssh客户端问题,因为它自带了TortoisePlink)。
(2)使用echo %APPDATA%确定程序数据目录,编辑Subversion目录中的config文件,编辑关于管道的那节如下:
[tunnels]
ssh=plink
命令示例
svn co svn+ssh  "repos-URL" "workMenu"
Subversion现在使用了SSH来打开与服务器的连接,并且把你作为Unix用户来验证身份。Subversion使用标准的Unix用户和组权限来决定连接的用户是否有权访问项目仓库。
3、HTTP/HTTPS+Apache


文件加锁和二进制文件
合并文本只适用于文本文件,对于一些不可合并的文件(如图片、CAD),则需通过加锁来解决冲突问题。
任何文件都可以被设置为加锁模式,这样在编辑前就必须先开锁。设置加锁模式是通过设置它的needs-lock属性(属性具体包含什么没有关系,只要被设置就生效)。
任何加锁了的文件签出到工作拷贝中的时候都是只读的。
当锁住文件的用户完成提交后,Subversion会自动解开任何他拥有的锁(他工作拷贝中“所有文件”的锁,而不仅是提交的那些)。

(1)开启文件加锁
svn propset svn:needs-lock "anyValue" "fileName"
(2)基本文件加锁
svn lock "fileName" -m "Why i lock"
(3)查询文件详细信息(包括加锁信息)
svn info "URL" "fileName"
需要完整的URL才能找出别人加锁信息。
(4)把锁砸坏
svn unlock可用于解开自己的锁,加上--force可解开别人的锁。
svn unlock --force "fileName"
(5)偷锁
svn lock --forcez
通过把锁砸坏和偷锁可以看出,Subversion的锁并不是绝对的锁,只是提供了一种沟通协作的机制。

注:
加锁过程中最好附带注释;
每次尽可能快尽可能少地锁住文件;
Subversion只会在文件是更新到最新版本的情况下才会让你锁住这个文件,你不能锁住旧版的文件。可以加入一些机制来控制加解锁(pre/post-lock/unlock)。


标签和分支
标签和分支都是通过拷贝Subversion项目仓库中的目录来实现的。
标签和分支可以(而且应该是)用起来简单,真正困难的是把它们用在合适的场合。
两个合适的场合:
1、发布新版本
2、给开发者一个试验的空间
典型的四个用途:
1、发布分支:目录名可为RB-rel,rel为发布号
2、发布:目录名可为REL-rel
3、Bug修正:目录名可为BUG-track,track为bug跟踪号
4、开发人员的试验:TRY-xxx

标签
标签是给文件取的符号名称,每个都有一个特定的版本号,可以看做项目仓库的切片(版本号也是一种切片,只是难记)。
标签可以是从混合版本的工作拷贝创建而来——你签出的文件并不是都对应同一个项目仓库版本号。如果你想要挑选出项目组件的不同版本,在发布的时候打包在一起的话,就可以yoga标签。
一般不修改标签目录下存储的代码(当然谁也无法组织你这么干),如果确实要改变标签目录中的内容,标签实际上就成分支了(标签包含的不再是项目仓库的静态快照了)。


在发布分支上开发
访问发布分支有两种方式:
1、把发布分支签出到另一个目录(推荐):更清晰
2、把工作拷贝转向到发布分支(switch命令)

在发布分支中修正bug
在发布分支中,这意味着需要跟踪我们为修正bug所做的改动,然后确保把这些修正代码应用到其他可能包含相同问题的分支之中。
1、简单的bug:只需一次提交就能修正
记住修订提交后的新版本号,利用它把改动合并到其他受影响的分支中(可能还包括主干)。
>"fix the bug"
>svn commit,得到新版本号12
>cd anotherBranch,进入一个受影响的分支
>update,得知最新版本号为12(假如当前为10)
>svn merge -r10:12 "包含修正代码的目录名"

2、复杂的bug
创建一个分支来跟踪修正过程:创建一个分支,使用标签标记修正过程的开始和结束,然后把修正代码合并到其他分支中。
具体参见《版本控制之道》。

.

..

...

仓库访问权限管理(使用svnserve情况):三个文件(均位于“库/conf”目录下)

1、svnserve.conf

2、password

3、authz

设置对用户(组)对仓库各路径的访问权限('rw'/‘r'/'')

1 )用户某个目录的权限是向子目录递归的。如果用户对于 /foo 目录有读写权限,则该用户对于 foo 目录下的所有子目录都有读写权限。

2 )权限分配,只可以分配到某个目录,而不能到某个文件。
http://my.chinaunix.net/space.php?uid=10167808&do=blog&id=25994

.

..

...

命令行 Subversion 入门

如果您参与的项目正在使用 Subversion 进行版本控制,您将需要使用 Subversion 访问和更改项目源文件。您可以点击项目的左侧导航窗格上的“Subversion” 链接,在线浏览源代码以查看该项目的目录结构和文件。

“Subversion” 页面显示三个子目录:branches/、tags/、trunk/ 和一个自述文件。自述文件可以使您对 Subversion 存储库有一个整体了解。您可以点击“访问选项” ,查看 Subversion 客户端安装说明。您的本地计算机上必须安装有 Subversion 客户端。

获取项目的本地工作副本svn checkout

若要获取最新源文件的“工作副本”,您必须首先签出这些源文件,这一过程会将文件从存储库复制到您的系统中。在您的外壳程序或终端客户端,请键入:

svn checkout https://(项目名称).(域)/svn/(项目名称)/(DIR) (项目名称) --username [在此处输入用户名]

当系统提示您时输入您的用户密码。此密码应与您在本站点中的用户帐号的密码相同。不指定目录将签出整个项目源代码。您可能希望签出“trunk/”目录,因为此目录具有工作“www/”文件夹。

转换 :--revision (-r) REV, --quiet (-q), --non-recursive (-N), --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

请参见基本工作周期初始签出工作副本

注意 :如果站点未启用 SSL(安全套接字层),则在执行 Subversion 操作时,请使用 http 而不是 https 。例如,若要从项目的存储库中签出最新的源代码,请使用以下命令:

svn checkout https://(项目名称).(域)/svn/(项目名称)/(DIR) (项目名称) --username [在此处输入用户名]

处理 Subversion 存储库中的文件

从项目存储库中签出本地副本后,您可以在本地计算机上编辑现有文件、创建新文件和目录、以及删除文件。在您将所做的任何更改提交回 Subversion 存储库之前,这些更改只对项目文件的本地副本起作用。

将工作副本中的文件/目录添加到存储库中svn add

在您第一次在工作目录中创建并编辑新文件后,可以将此文件添加到存储库中,或添加一个目录,目录中有无内容均可。

svn add FILENAME/DIR

这样就会在您的工作副本中添加文件/目录,并安排它们以添加到存储库中。您下次提交时,会上载这些文件/目录,并将它们添加到存储库中。如果您了添加内容,但在提交前又改变了主意,则可以使用 svn revert 取消添加内容的安排。

转换 :--targets FILENAME, --non-recursive (-N), --quiet (-q), --config-dir arg, --auto-props, --no-auto-props

请参见添加文件/目录示例

查看带有修订和作者信息的特定文件的内容svn blame

若要在线查看指定文件的作者和修订信息,请键入:

svn blame FILENAME

每行文本的开始处都以上次更改该行的作者(用户名)和修订版本号作为批注。

转换 :--revision (-r) REV, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

查看特定文件的内容svn cat

有时,与存储库相比较,您的工作副本可能已过时;或者您可能已修改了本地工作副本。在这些情况下,在提交更改或决定编辑您的工作副本之前,您会希望查看指定文件的内容差异。运行 svn cat FILENAME 将自动从存储库中取出 HEAD 修订版本。这条子命令主要用于检索具有较旧修订版本号的文件,并将其显示在屏幕上。通过在此站点上浏览项目源代码,也可以执行相同的操作。

转换 :--revision (-r) REV, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

清理工作副本svn cleanup

有时可能会出现“工作副本已锁定”错误。若要删除锁定,并递归清理工作副本,请使用 svn update

转换 :--diff3-cmd CMD, --config-dir DIR

请参见 svn cleanup

复制工作副本或存储库中的文件或目录svn copy

在项目中,您可能需要用到过去的旧文档。例如,您可能想要使用一个已存在的 HTML 文件,使用其代码作为参考以在创建新内容时保持产品外观和感觉。创建文件时,您无需从头开始,只需使用 svn copy 复制此文件,然后将其另存为其它名称并更改其内容。您可以从存储库将文件复制为本地工作副本,也可以将本地工作副本复制回存储库文件。您还可以在本地工作副本内部复制文件。Subversion 不支持在存储库之间进行复制。可使用 svn copy SRC DST 完成此操作。

转换 :--message (-m) TEXT, --file (-F) FILE, --revision (-r) REV, --quiet (-q), --username USER, --password PASS, --no-auth-cache, --non-interactive, --force-log, --editor-cmd EDITOR, --encoding ENC, --config-dir DIR

请参见 svn copy

从本地工作副本中删除文件或目录svn delete

您可能希望从本地工作副本中删除不需要的文件。使用 svn delete FILENAME 可安排删除文件。仅当您提交时,才会在存储库中将该文件实际删除。

转换 :--force, --force-log, --message (-m) TEXT, --file (-F) FILE, --quiet (-q), --targets FILENAME, --username USER, --password PASS, --no-auth-cache, --non-interactive, --editor-cmd EDITOR, --encoding ENC, --config-dir DIR

查看文件之间的差异svn diff

可以使用 svn diff 显示工作副本中的指定文件相对于存储库中相应文件所做的本地修改。在命令提示符处,请键入:

svn diff (文件的路径) (项目存储库的 URL)

例如,若要将本地修改后的文件“index.html”与项目存储库中的相应文件进行比较,请键入:

svn diff $SRC/...../index.html https://(项目名称).(域)/svn/(项目名称)/trunk (项目名称) --username [在此处输入用户名]

除此之外,您也可以转到该文件所属的目录,并键入:

svn diff (FILENAME)

该命令将显示差异,并且带有修订版本号。

转换 :--revision (-r) REV, --old OLD-TARGET, --new NEW-TARGET, --extensions (-x) "ARGS", --non-recursive (-N), --diff-cmd CMD, --notice-ancestry, --username USER, --password PASS, --no-auth-cache, --non-interactive, --no-diff-deleted, --config-dir DIR

请参见检查历史svn diff

在本地计算机上导出空目录树svn export

在您的本地计算机上,可以从项目存储库或本地工作副本内部提取一个无版本的副本,也称为空目录树。若要从存储库中获得较旧修订版本的空目录,请键入:

svn export [-r REV] [PATH]

该 命令将从 URL 指定的存储库中的修订版本 REV 位置(如果指定,否则从 HEAD 位置)将空目录树导出到 PATH。如省略 PATH,则该 URL 的最后一部分将用作本地目录名称。除此之外,您也可以在本地计算机内部,从一个工作副本(由 PATH1 指定)向另一工作副本(由 PATH2 指定)导出空目录树。这将保留所有的本地更改,但不会复制版本控制中的文件。若要执行此操作,请键入:

svn export PATH1 PATH2

转换 :--revision (-r) REV, --quiet (-q), --force, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

获取有关 Subversion 的帮助svn help

Subversion 可以在命令行界面为您提供帮助。若要获得有关特定子命令的帮助,请键入:

svn help [SUBCOMMAND...]

转换 :--version, --quiet (-q)

将您的更改提供给 SVN 存储库

对文件和/或目录进行本地更改后,您必须向 SVN 存储库提交这些更改。

提交您的更改svn commit

若要向共享存储库提交您的更改,请键入:

svn commit -m "请在此处键入您的理由"

如果您不包括对该文件更改的描述,系统将提示您调用文件编辑器添加描述,然后 svn 才能完成提交操作;否则将会出现“提交失败”错误。所有的提交都会被自动记录,并发布到项目的提交讨论中。

转换 :--message (-m) TEXT, --file (-F) FILE, --quiet (-q), --non-recursive (-N), --targets FILENAME, --force-log, --username USER, --password PASS, --no-auth-cache, --non-interactive, --encoding ENC, --config-dir DIR

请参见提交您的更改editor-cmd

将无版本的文件或树导入到项目存储库中svn import

您可以使用 svn import 将无版本的文件或树递归提交到项目存储库中。将根据需要在存储库中创建父目录。使用下面的命令可以从 PATH 向 URL 递归提交副本。如果省略 PATH,将认为其为“.”。

svn import [PATH] URL

示例:若要在您的本地计算机上创建带有一个文件的无版本目录 (D )。请点击项目左侧导航窗格中的“Subversion” 链接,找到 Subversion 页面。请注意,“浏览源代码” 下未列出 NEWDIR。若要将 D 导入项目存储库,请键入:

svn import -m "请在此处键入您的信息" D http://(项目名称).(域)/svn/(项目名称)/NEWDIR

刷新该页面。请注意,此时“浏览源代码” 下列出了 D 。点击 D 查看该文件。

转换 :--message (-m) TEXT, --file (-F) FILE, --quiet (-q), --non-recursive (-N), --username USER, --password PASS, --no-auth-cache, --non-interactive, --force-log, --editor-cmd EDITOR, --encoding ENC, --config-dir DIR, --auto-props, --no-auto-props

打印有关工作副本中路径的信息svn info

有时,您将需要有关工作副本中文件的具体信息,以执行某些子命令。键入 svn info ,将打印出详尽且有用的信息,这些信息涉及工作副本中的工作副本路径中的项,其中包括:路径、名称、URL、修订版本、节点类型、上次更改、作者、上次更改修订版本、上次更改日期、上次更新的文本、上次更新的属性以及校验和。

转换 :--targets FILENAME, --recursive (-R), --config-dir DIR

查看存储库中的目录项列表svn list

在开始处理项目或取出“工作副本”之前,您可能希望查看项目存储库中的内容(即目录和文件),或查看本地工作副本中的目录项。在命令提示符处键入 svn list [TARGET...] ,也可以查看这些内容。除此之外,您也可以找到项目中的“软件配置管理” 页,查看项目存储库。

转换 :--revision (-r) REV, --verbose (-v), --recursive (-R), --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

查看提交日志信息svn log

如果要查看“工作副本”或存储库中文件/目录的各个文件/目录历史,以跟踪修订信息,请键入:

svn log [PATH]

该命令会显示出文件/目录的修订信息,从最近所做的修订版本开始显示提交信息和作者姓名等信息。除此之外,您也可以使用该站点,查看项目存储库中各个文件的提交日志信息。请点击项目左侧导航窗格中的“Subversion” 链接。将出现 Subversion 页。搜索“浏览源代码” 的目录中的文件,然后点击文件名。这时将会显示一个提交日志信息页面。

转换 :--revision (-r) REV, --quiet (-q), --verbose (-v), --targets FILENAME, --stop-on-copy, --incremental, --xml, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

请参见 svn log

合并更改svn merge

您可以运行 svn merge 命令,以指示 Subversion 将存储库中最新版本的文件合并到您的工作副本中。

转换 :--revision (-r) REV, --non-recursive (-N), --quiet (-q), --force, --dry-run, --diff3-cmd CMD, --ignore-ancestry, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

请参见 svn merge 解决冲突(合并其他人的更改)分支和合并:常见合并使用案例合并最佳实践

使用存储库

创建新目录svn mkdir

若要在您的工作副本中创建新目录,请键入:

svn mkdir PATH

若要在您的项目存储库中创建新目录,请键入:

svn mkdir URL

PATH 或 URL 的最后一部分决定目录名称。在立即提交时在存储库中创建目录,所以还需要一条提交信息

转换 :--message (-m) TEXT, --file (-F) FILE, --quiet (-q), --username USER, --password PASS, --no-auth-cache, --non-interactive, --editor-cmd EDITOR, --encoding ENC, --force-log, --config-dir DIR

移动文件或目录svn move

您可以使用 svn move SRC DST 在工作副本或项目存储库内部移动文件或目录。此命令等效于在使用 svn copy 后,再使用 svn delete 。在工作副本内部移动文件或目录,不仅会移动该文件或目录,而且还将安排它以便于下次提交时进行添加。在项目存储库内部移动文件或目录属于封闭单元式提交,所以需要一条提交信息。

转换 :--message (-m) TEXT, --file (-F) FILE, --revision (-r) REV, --quiet (-q), --force, --username USER, --password PASS, --no-auth-cache, --non-interactive, --editor-cmd EDITOR, --encoding ENC, --force-log, --config-dir DIR

使用属性

Subversion 具有很多具体属性,这些属性影响或决定其行为。您可以修改、提交和撤消属性更改,就像对文件内容所执行的操作一样。您还可以从本地工作副本或项目存储库的文件、目录或修订版本中,删除、编辑、打印、列出以及设置属性。

请参见 属性无版本属性元数据属性svn propdel svn propedit svn propget svn proplist svn propset Hook 脚本

解决冲突svn resolved

更新本地工作副本时,可能会遇到冲突。您需要解决此冲突。解决冲突后,键入 svn resolved PATH... ,通知工作副本该冲突已“解决”。

转换 :--targets FILENAME, --recursive (-R), --quiet (-q), --config-dir DIR

请参见解决冲突(合并其他人的更改)

撤消您的更改svn revert

使用 Subversion 时,您会发现 svn revert PATH... 等效于 Windows 中的 Ctrl Z 。您可以:

  • 撤消本地工作副本中的任何本地更改,从而解决冲突状态。
  • 撤消工作副本中的条目内容及属性更改。
  • 取消任何进度安排操作,如添加文件、删除文件等。

注意 ,如不提供目标,会导致工作副本中的更改丢失。

转换 :--targets FILENAME, --recursive (-R), --quiet (-q), --config-dir DIR

获取文件/目录的状态svn status

在版本控制中,将更改提交到项目存储库之前最好对其进行审查。可以运行 svn status 打印工作副本中的文件和目录的状态。打印结果为八列编码输出。由于每列都有详尽的图例,若要从此输出中得出“无错误”的结论几乎不可能。若要使此任务更加简单,并同时可看到示例,请在命令提示符处键入 svn help status

转换 :--show-updates (-u), --verbose (-v), --non-recursive (-N), --quiet (-q), --no-ignore, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir

请参见检查你的更改

转换工作副本svn switch

可以使用 svn switch URL [PATH] 更新工作副本,以镜像新的 URL。您还可以将工作副本或部分工作副本移动到新的分支。您可以将此子命令用作分支的快捷方式。

转换 :--revision (-r) REV, --non-recursive (-N), --quiet (-q), --diff3-cmd CMD, --relocate, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

请参见转换工作副本分支和合并 以及 svn switch

更新工作副本svn update

为了进行更好的版本控制,建议您每天用项目存储库更新本地工作副本,请使用:

svn update [PATH...]

列出的已更新条目以及它们的当前状态显示如下:

  • A = 已将一个文件添加到您的工作副本中。
  • U = 已更新您的工作副本中的一个文件。
  • D = 已从您的工作副本中删除一个文件。
  • R = 已替换您的工作副本中的一个文件。
  • G = 已成功合并了一个文件。
  • C = 一个文件已合并了必须手动解决的冲突

转换 :--revision (-r) REV, --non-recursive (-N), --quiet (-q), --diff3-cmd CMD, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

请参见更新你的工作副本手动合并冲突

 

分支和标记

项 目的主干通常用作开发主线,而分支通常用作主线的变更。分支是正在进行的开发线。在软件开发生命周期中,如果软件产品的发布版本已到期,经常会用到分支, 使测试者可以使用候选版本,使新的开发可以继续进行,不受测试的约束。分支还用于实验性工作,以及完成代码重写。标记是将一组文件修订版本标记为整体的方 式。虽然分支和标记都是使用 svn copy 子命令创建的,但它们是完全不同的。分支表示多个修订版本而标记只表示单个修订版本。

本站点上您项目的 Subversion 存储库支持对您的源文件进行分支和标记。对于 Subversion 来说,标记和分支属于简单实用的“复制”操作。

若要创建分支或标记项目文件,请键入:

svn copy SRC DST -m "在此处键入您的信息"

请参见分支和合并

 


备份与恢复(导出与导入)

Subversion导出与导入

备份:

svnadmin dump 仓库路径 > 导出文件路径

例如: SVN仓库在d:/cks 里面建立了一个test的仓库,我们想导出一个test0.1(该文件也在仓库)的仓库备份

svnadmin dump d:/cks/test > test0.1

恢复:

svnadmin load 仓库路径 < 备份文件

注意:导入之前先要新建仓库,不能往一个空的目录导。

例如:SVN仓库在d:/cks 里面建立了一个test的仓库,我们想导入test0.1(该文件也在仓库)的仓库备份到该仓库

svnadmin load d:/cks/test < test0.1

 

 

 

.

..

...

搭建Subversion服务器
1、软件下载
服务器:Subversion服务器(VisualSVN Server也是一个不错的选择)
客户端:TortoiseSVN,这是Subversion的windows客户端

 

 

2、服务器和客户端安装:简单

 

 

3、建立版本库(Repository)
运行Subversion服务器需要首先要建立一个版本库(Repository),可以看作服务器上存放数据的数据库,在安装了Subversion服务器之后,可以直接运行,如:
svnadmin create E:/svndemo/repository
就会在目录E:/svndemo/repository下创建一个版本库。
我们也可以使用TortoiseSVN图形化的完成这一步:
在目录E:/svndemo/repository下"右键->TortoiseSVN->Create Repository here...“, 然后可以选择版本库模式, 这里使用默认即可, 然后就创建了一系列目录和文件。

 

 

4、配置用户和权限
来到E:/svndemo/repository/conf目录,修改svnserve.conf:
# [general]
# password-db = passwd
改为:
[general]
password-db = passwd 然后修改同目录的passwd文件,去掉下面三行的注释:
# [users]
# harry = harryssecret
# sally = sallyssecret
最后变成:
[users]
harry = harryssecret
sally = sallyssecret

 

 

5、运行独立服务器
在任意目录下运行:
svnserve -d -r E:/svndemo/repository 我们的服务器程序就已经启动了。注意不要关闭命令行窗口,关闭窗口也会把svnserve停止。

!!!!另一种方式:
借助SvnService,可以将SubVersion服务包装成Windows NT服务,实现随windows启动。
SubVersion本身是由命令行启动的,在SubVersion安装目录中找到,它不能像Windows NT服务一样随Windows启动,需要借SVNService来包装成Windows NT服务.具体设置如下:
将下载的SVNService解包后,将其中的拷贝到SubVersion的安装目录中的/bin目录, 保证SVNService.exe和svnserve.exe在同一目录.
然后安装服务:
    运行命令:SVNService -install -d -r <svnroot>
    在实际操作中,<svnroot>代表SubVersion服务的电子仓库目录.

    改变服务设置:
    运行命令:SVNService -setup -d -r <newsvnroot>
    在实际操作中,<newsvnroot>代表与SubVersion服务启动时不同的电子仓库目录.

    删除服务:
    运行命令:SVNService -remove



6、初始化导入
来到我们想要导入的项目根目录,在这个例子里是E:/svndemo/initproject,目录下有一个readme.txt文件:
右键->TortoiseSVN->Import...
URL of repository输入“svn://localhost/”
ok
完成之后目录没有任何变化,如果没有报错,数据就已经全部导入到了我们刚才定义的版本库中。
需要注意的是,这一步操作可以完全在另一台安装了TortoiseSVN的主机上进行。例如运行svnserve的主机的IP是133.96.121.22,则URL部分输入的内容就是“svn://133.96.121.22/”。

 

 

7、基本客户端操作
取出版本库到一个工作拷贝:
来到任意空目录下,在本例中是E:/svndemo/wc1,运行右键->Checkout,在URL of repository中输入svn://localhost/,这样我们就得到了一份工作拷贝。
在工作拷贝中作出修改并提交:
打开readme.txt,作出修改,然后右键->Commit...,这样我们就把修改提交到了版本库,我们可以运行。

查看所作的修改:
readme.txt上右键->TortoiseSVN->Show Log,这样我们就可以看到我们对这个文件所有的提交。在版本1上右键->Compare with working copy,我们可以比较工作拷贝的文件和版本1的区别。

 

 



Subversion有两种不同的配置方式,一种基于它自带的轻量级服务器svnserve,一种基于非常流行的Web服务器Apache。
根据不同的配置方式,Subversion使用不同的端口对外提供服务。
基于svnserve的,默认端口为3690,
基于Apache的,默认端口为Apache的默认端口80。
有时候,我们会因为防火墙或其它原因,需要修改这些默认端口。
下面根据不同的配置讲讲如何改变这些默认端口。
1、通过svnserve -d -r d:/svn来提供服务 (假设d:/svn为你的版本库所在目录)
为svnserve 加上--listen-port参数,比如svnserve -d -r d:/svn --listen-port 81
2、通过Apache来提供服务
在httpd.conf中,查找Listen 80,将80修改为你想要的端口



当出现'目标机器积极拒绝,无法连接'或svn: Can't connect to host ...时,请依次检查下面各项:
1,服务器有没有运行,有没有打开相应端口
如果服务器是svnserve,检查有没有运行svnserve,有没有打开3690端口
如果服务器是apache,检查apahce是否运行,是否打开80端口
检查时可以在服务器运行netstat -na看看相应端口是否在LISTEN
2,防火墙有没有开放相应端口
3,客户端是否可以连接服务器的相应端口
使用命令telnet 服务器IP 相应端口
如:telnet 192.168.0.1 3690

 

 

 

Error : svnserve.conf:12: Option expected svnserve.conf
In svnserve.conf, you cannot have a space before you set an argument and a variable. It doesn’t find the argument. Open svnserve.conf and delete extra spaces at the beginning of any line.
参数和变量设置时,行首不能有空格。

 

 

 

 

强制写日志才能提交代码有两种方法,

1、是通过SVN客户端软件,简单方便,但只能针对特定的客户端。

2、是通过修改SVN服务器的钩子脚本,对所有的SVN客户端均有效,但需要获取SVN服务器管理权限。

 

修改SVN客户端的方法(以TortoiseSVN为例)

TortoiseSVN 使用属性来控制它的一些特性。这其中有一个 tsvn:logminsize 属性。在需要修改工作副本,右键到properties 选定,出现如下图所示clip_image002

点new按钮,出现如图

clip_image004

选择图中的tsvn:logminsize属性,设置属性值就是最小日志长度。在提交前如果日志的长度没有达到最小长度的要求,提交按钮将是灰色,表示不能提交。

 

在SVN服务器修改写日志钩子脚本

将下面的代码存为pre-commit.bat放到版本库的hooks目录下即可,当你不写日志提交的话就会报告错误。(如果你下载使用,需要修改SVN_BINDIR为你的Subversion安装的程序目录)

@echo off
set SVN_BINDIR=d:/Subversion/bin
setlocal
set REPOS=%1
set TXN=%2
rem check that logmessage contains at least 10 characters
%SVN_BINDIR%/svnlook log "%REPOS%" -t "%TXN%" | findstr ".........." > nul
if %errorlevel% gtr 0 goto err
exit 0
:err
echo Empty log message not allowed. Commit aborted! 1>&2
exit 1

 

 

 


解决冲突
1、两者的改动没有互相重叠,改的不是同一个地方
commit时提示:“...'filename' in transaction '7'”
解决方法:先update,在commit
2、两者同时改动同一个地方
commit时提示:“...'filename' in transaction 'c'”
解决方法:
(1)update,返回消息中带有C标志,表示有冲突存在;
(2)打开查看产生冲突的文件,其中<<<<<<<和>>>>>>>标明了冲突发生的地方。其中还包含别人的代号,如r6;
(3)svn log -r6 "filename",找出谁在项目中做出了这个改动;
(4)协商最终改动后,移除Subversion的冲突标记;
(5)svn resolved "filename",告诉Subversion我们已经解决了冲突;
(6)重新commit。

 

 

忽略某些文件

“放在那儿挺好,但不需要存储到项目仓库的文件”

设置svn:ignore属性

若想创建了一个文件夹,并且把它加入版本控制,但忽略文件夹中的所有文件的内容:

$ svn mkdir spool
$ svn propset svn:ignore '*' spool
$ svn ci -m 'Adding "spool" and ignoring its contents.'

若想创建一个文件夹,但不加入版本控制,即忽略这个文件夹:

$ mkdir spool
$ svn propset svn:ignore 'spool' .
$ svn ci -m 'Ignoring a directory called "spool".'

若已经创建了文件夹,并加入了版本控制,现在想忽略这个文件夹,但要保持文件夹的内容:

$ svn export spool spool-tmp
$ svn rm spool
$ svn ci -m 'Removing inadvertently added directory "spool".'
$ mv spool-tmp spool
$ svn propset svn:ignore 'spool' .
$ svn ci -m 'Ignoring a directory called "spool".'

 

 

svn:ignore 性质包含了档案样式的列表, Subversion 处理时会忽略. 它可以与执行时期设定的 global-ignores 选项一起工作, 以便在类似 svn status 的命令中过滤掉未纳入版本控制的目录与档案. 
我们知道新增的文件和目录必须透过 svn add 命令, 才会被纳入 Subversion 的管理. svn status 命令会将工作复本中未纳入版控制目录与档案显示出来. 
$ svn status calc
 M     calc/button.c
?      calc/calculator
?      calc/data.c
?      calc/debug_log
?      calc/debug_log.1

在这个范例中, 用?标注出来的文件就是未纳入版控制的档案.如果你不想每次执 行 svn status 时, 都看到这些档案, 那幺svn:ignore 性质就是解决方案。你可以透 过 svn propedit svn:ignore calc 对 calc 目录加上一些忽略样式. 举个例子,将以下的值作 为 svn:ignore 性质的新内容: 
calculator
debug_log*
加上这个性质后再执行你的 svn status 输出便会不同:
$ svn status
 M     calc
 M     calc/button.c
?      calc/data.c
现在, 所有不想看到的东西都从输出中消失了! 

http://www.chinaunix.net/jh/4/467795.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/searchwc/article/details/6400343

智能推荐

深度学习常用数据集介绍_set5数据集-程序员宅基地

文章浏览阅读1.4w次,点赞12次,收藏145次。数据集大全介绍深度学习的关键是训练。无论是从图像处理到语音识别,每个问题都有其独特的细微差别和方法。但是,你可以从哪里获得这些数据?现在你看到的很多研究论文都使用专有数据集,而这些数据集通常不会向公众发布。如果你想学习并应用你新掌握的技能,数据就成为一个问题。在本文中,我们列出了一些高质量的数据集,每个深度学习爱好者都可以使用并改善改进他们模型的性能。拥有这些数据集将使你成为一名更好的数据科学家,并且你将从中获得无可估量的价值。我们还收录了具有最新技术(SOTA)结果的论文,供你浏览并改进你的模型。_set5数据集

初识C语言-程序员宅基地

文章浏览阅读515次,点赞18次,收藏13次。1.C语言中有一批保留名字的符号被称为保留字或关键字,有着特殊的意义2.程序员在创建标识符的时候不能和关键字重复3.关键字不能自己创建。

OpenCV入门(八)——形态学技术_opencv形态学-程序员宅基地

文章浏览阅读2.9k次。目录0x01 腐蚀膨胀操作0x02 开闭运算操作0x03 形态学梯度0x04 形态学Top-Hat0x05 用在哪?角点提取、车牌提取数学形态学是基于集合论的图像处理方法,最早出现于生物学的形态与结构中,图像处理中的形态学操作用于图像预处理操作(去噪、形状简化)、图像增强(骨架提取、细化、凸包及物体标记)、物体背景分割及物体形态量化等场景中。数学形态学利用点集的性质、积分几何集及拓扑学理论对物体像素集进行变换。那么操作有如下: 腐蚀与膨胀操作 开闭运算操作及实_opencv形态学

【Java 基础篇】Java多线程编程详解-程序员宅基地

文章浏览阅读1.9k次,点赞3次,收藏14次。本文详细介绍了Java多线程编程的概念、原理和常用技术。多线程编程可以提高程序的性能和响应能力,但也需要注意线程安全和线程同步的问题。在实际开发中,合理地使用多线程可以充分发挥多核处理器的优势,提高程序的并发能力和执行效率。同时,需要注意避免多线程之间的竞争条件和数据一致性问题,保证线程的安全性和正确性。希望本文对你理解和应用Java多线程编程有所帮助!_java多线程编程

Markdown自动换行_markdown内的文本随屏幕宽度自动换行-程序员宅基地

文章浏览阅读1.1w次,点赞5次,收藏3次。在每一行末尾打两个空格然后回车下一行继续写就可以在显示的时候自动换行了。_markdown内的文本随屏幕宽度自动换行

pytest导入自定义模块报错:ModuleNotFoundError: No module named ‘xxx‘_modulenotfounderror: no module named 'lib-程序员宅基地

文章浏览阅读6k次,点赞4次,收藏10次。代码:import pytestfrom selenium import webdriverfrom lib.webui import loginAndCheck报错:ModuleNotFoundError: No module named 'lib'解决办法:让系统先从当前路径检索。即解决import os, syssys.path.append(os.getcwd())import pytestfrom selenium import webdriverfrom lib.w_modulenotfounderror: no module named 'lib

随便推点

Python自定义模块 带解释_python frame table-程序员宅基地

文章浏览阅读362次。带滚动条的窗口由于滚动条不能绑定窗口或框架,只能在窗口下创建frame,在frame下创建canvas,滚动条绑定canvas创建窗口,固定其尺寸,不允许修改创建画布 - 创建滚动条 - 画布和滚动条放在同一个parent下创建frame,其尺寸占画布宽、高的90%结合窗口、画布、frame,创建带滚动条的窗口为滚动条设置滚动范围(canvas绑定滚动条要设置scrollregion才能生效)from tkinter import *def create_win(title=None,_python frame table

POJ 3253 Fence Repair(贪心)-程序员宅基地

文章浏览阅读129次。DescriptionFarmer John wants to repair a small length of the fence around the pasture. He measures the fence and finds that he needs N (1 ≤ N ≤ 20,000) planks of wood, each having some integer lengt...

gamit 10.71 9月1日更新包更新内容 incremental_updates.20200901.tar.gz_igs nanu-程序员宅基地

文章浏览阅读1.2k次。12345678901234567890123456789012345678901234567890123456789012345678901234567890 Incremental Updates for GAMIT/GLOBK 10.71 This file lists updates available immediately in the incremental_updates/ directory. These are combined i_igs nanu

java oom-killer_Tomcat崩溃kernel: java invoked oom-killer: gfp_mask-程序员宅基地

文章浏览阅读473次。场景Jan 16 03:03:57 host-172-16-61-102 vm-agent: network-posix.c GetIpv4VifIp 1201 : failed to GetIpv4VifGatewayJan 16 03:03:57 host-172-16-61-102 vm-agent: popen errorJan 16 03:03:58 host-172-16-61-102..._ai-_ai_record_t invoked oom-killer: gfp_mask=0x200da, order=0, oom_score_adj

Apache Spark作为编译器:深入介绍新的Tungsten执行引擎 -程序员宅基地

文章浏览阅读1.6k次。原文链接:Apache Spark as a Compiler: Joining a Billion Rows per Second on a Laptop Deep dive into the new Tungsten execution engine 作者:Sameer Agarwal、Davies Liu、Reynold Xin 译者:@过往记忆,极客头条主编,目前主要工..._tungsten execution是什么

第二节02 CIM精度以及制作流程_cim数据源精度-程序员宅基地

文章浏览阅读979次,点赞19次,收藏17次。基于采集的连续地形影像为基础,利用自动建模工具,快速生成全国全域三维数据底板,为宏观场景展示提供数据支撑。_cim数据源精度

推荐文章

热门文章

相关标签