380 likes | 564 Views
SVN by David Zhang. 内容. Svn帮助文档 Svn基本操作 Svn 锁定与解锁 Svn分支和合并 TracLink的使用. svn --help 用法: svn <subcommand> [options] [args] svn help <subcommand> SVN官方网站: http://subversion.tigris.org/ TracLink http://trac.edgewall.org/wiki/TracLinks. 帮助. 1.1 导入数据到版本库.
E N D
内容 Svn帮助文档 Svn基本操作 Svn 锁定与解锁 Svn分支和合并 TracLink的使用
svn --help 用法: svn <subcommand> [options] [args] svn help <subcommand> SVN官方网站: http://subversion.tigris.org/ TracLink http://trac.edgewall.org/wiki/TracLinks 帮助
1.1 导入数据到版本库 svn import 是将未版本化文件导入版本库的最快方法,会根据需要创建中介目录。 $ svnadmin create /somewhere $ svn import mytreehttp://10.131.38.110/repo/test \ -m "Initial import" Adding mytree/foo.c Adding mytree/bar.c Adding mytree/subdir Adding mytree/subdir/quux.h Committed revision 1. 注意:如果import的是个目录, 则其下的内容直接加入到URL指定的位置内
1.2 初始化检出 使用Subversion,从checkout开始 创建本地拷贝 默认检出HEAD版本 $ svn checkout http://10.131.38.110/repos/test A trunk/Makefile.in A trunk/ac-helpers A trunk/ac-helpers/install.sh A trunk/ac-helpers/install-sh A trunk/build.conf ... Checked out revision 8810.
1.3 基本的工作循环 • 可能会取消一些修改 svn revert • 解决冲突(合并别人的修改) svn update svn resolved • 提交你的修改 svn commit • • 更新你的工作拷贝 • svn update • • 做出修改 • svn add • svn delete • svn copy • svn move • • 检验修改 • svn status • svn diff
1.3.1 更新你的工作副本 $ svn update U foo.c U bar.c Updated to revision 2. 每更新一项就输出一行信息,使用首字符来报告执行的动作。 这些字符的含义是: A 已添加 D 已删除 U 已更新 C 合并冲突 G 合并成功 E 已存在
1.3.2 修改你的工作副本 已存在文件可编辑器直接修改 不存在的文件通过以下几个命令添加 svn add foo #可以是文件和目录 svn delete foo #svn delete PATH | URL svn copy foo bar #svn copy SRC[@REV] DST svn move foo bar #svn move SRC DST svn mkdir blort #svn mkdir PATH | URL
1.3.3 检查你的修改 查看修改概况 $svn status A stuff/loot/bloo.h #A表示要添加的 C stuff/loot/lump.c #C表示冲突 D stuff/fish.c #D表示删除 M bar.c #M表示修改
1.3.4 检查你的本地修改的详情 $ svn diff #diff [-c M | -r N[:M]] [TARGET[@REV]...] $ svn diff > patchfile $ svn diff -- diff-cmd /usr/bin/diff \ --extensions '-bc' foo.c
1.3.5 取消本地修改 例2 $ svn status README README $ svn delete README D README $ svn revert README Reverted 'README' $ svn status README README • 例1 • $ svn status foo • ? foo • $ svn add foo • A foo • $ svn revert foo • Reverted 'foo' • $ svn status foo • ? foo
1.3.5 解决冲突(合并别人的修改) $ svn update U INSTALL #U表明本地没有修改 G README #G表示合并 C bar.c #C表示冲突 Updated to revision 46. 2. 遇到冲突时,三种选择: • “手动”合并冲突文本 • 用某一个临时文件覆盖你的工作文件。 • 运行svn revert 来放弃所有的本地修改。 3. $ svn resolved sandwich.txt Resolved conflicted state of 'sandwich.txt'
手工合并冲突 $ ls sandwich.* #因为冲突产生的额外文件 sandwich.txt sandwich.txt.mine sandwich.txt.r2 sandwich.txt.r1 $ vi sandwich.txt #修改冲突 $ svn resolved sandwich.txt $ svn commit -m "Go ahead and use my sandwich, discarding Sally's edits."
复制文件到你的工作文件 $ svn update C sandwich.txt Updated to revision 2. $ ls sandwich.* sandwich.txt sandwich.txt.mine sandwich.txt.r2 sandwich.txt.r1 $ cp sandwich.txt.r2 sandwich.txt $ svn resolved sandwich.txt $ svn ci
使用svn revert $ svn revert sandwich.txt Reverted 'sandwich.txt' $ ls sandwich.* sandwich.txt 注意,当你恢复一个冲突的文件时,不需要再运行svn resolved。 $ svn ci
提交你的修改 $ svn commit -m "Corrected number of cheese lices." Sending sandwich.txt Transmitting file data . Committed revision 3. $ svn commit -F logmsg Sending sandwich.txt Transmitting file data . Committed revision 4.
检验历史 svn log 每个版本附加在版本上的作者与日期 信息和所有路径修改。 svn diff 显示特定修改的行级详细信息。 svn cat 取得在特定版本的某一个文件显示在当前屏幕。 svn list 显示一个目录在某一版本存在的文件。
检验历史示例 • $ svn log • $ svn log -r 5:19 • $ svn log -r 19:5 • $ svn log -r 8 • $ svn log foo.c • $ svn log http://foo.com/svn/trunk/code/foo.c
浏览版本库 $ svn cat -r 2 rules.txt $ svn list -v http://svn.collab.net/repos/svn
Svn 锁 三种锁: 1. lock 描述了一种避免用户之间冲突提交的排他机制 2. 防止不同客户端同时操作同一份工作拷贝的锁(锁定标志L,svn cleanup) 3. 数据库锁 锁定令牌:
Svn 锁操作 上锁: $ svn lock file #file位于工作拷贝中 “file”被用户“DavidDW_Zhang@compal.com”锁定。 $ svn status file K file # K表示拥有锁定令牌 $ svn info file #URL 信息详细 解锁: $ svn unlock file “file”解除锁定 或者$ svn ci -m “.....” #也可解锁
没有锁定令牌 $ svn status -u M 23 bar.c M O 32 raisin.jpg #O表示被其他人锁定 revision: 105 $ svn info http://10.131.38.110/repos/test/file $ svn unlock –force file/http://…/repos/file
分支与合并 分支: 分支与主线分享共同的历史 Subversion并没有内在的分支概念—只有拷贝,当你拷贝一个目录,这个结果目录就是一个“分支”,只是因为你给了它这样一个含义而已。
创建分支 使用svn copy命令给你的工程做个拷贝 $ svn copy http://..../repos/trunk \ http://..../repos/branches/my-calc-branch \ -m "Creating a private branch of /calc/trunk." Committed revision 341. Subversion并没有内在的分支概念—只有拷 贝,当你拷贝一个目录,这个结果目录就是一个“分支”,只是因为你给了它这样一个含义 而已。
复制特定的修改 svn merge命令非常类似svn diff命令,它的结果作为本地修改作用到你的本地拷贝: $ svn merge -c 344 http://..../repos/trunk U integer.c $ svn status M integer.c 如果产生冲突,使用标准过程来解决这种状态,或者svn revert放弃本地修改
svn merge 使用 svn merge 将两个源差异应用至工作拷贝 用法:svn merge revision1 revision2 destination $ svn merge http://..../repos/branch1@150 \ http://..../repos/branch2@212 my-working-copy $ svn merge -r 100:200 http://..../repos/truck \ my-working-copy $ svn merge -r 100:200 http://..../repos/trunk #省略写法
常见用例 合并分支到另一个分支 取消修改
合并分支到主干 比较两个目录树,然后应用比较结果到工作拷贝 哪两个树进行比较呢? 只需要比较分支的初始状态与最终状态 $ svn log #可以找出分支开始版本 或者 $ svn log -v –stop-on-copy \ http://..../repos/braches/...
合并分支到主干2 合并流程: 1. $ svn co http://..../repos/truck 2. $ cd truck 3. $ svn merge -r r1:r2 http://..../repos/branchs 4. $ svn status M integer.c ….. 5. $ svn commit -m “Merged my-calc-branch…” Sending integer.c ……. Transmitting file data ... Committed revision 406.
取消修改 $ svn merge -c -303 http://..../repos/calc/trunk U integer.c $ svn status M integer.c $ svn diff $ svn commit -m "Undoing change committed in r303." Sending integer.c Transmitting file data . Committed revision 350.
常用分支模式 发布分支 特性分支:不象发布分支(也许要永远支持),特性分支出生,使用了一段时间,合并到主干,然后最终被删除掉,它们在有限的时间里有用。
标签 标签:一个标签只是一个项目某一时间的“快照” 建立标签: $ svn copy http://..../repos/trunk \ http://..../repos/tags/release-1.0 \ -m "Tagging the 1.0 release of the 'calc' project." Committed revision 351.
TracLinks 1. TracLink 是trac的基本特性之一,实质上是一种在Trac中使用的超连接。 2. 哪里需要使用TracLink: Source code (Subversion) commit messages Wiki pages 任何明确标明支持Wiki格式的地方(ticket、report、milestones等) 3. TracLink的一般使用形式 type:id
交叉引用-SVN TRAC 只要在SVN chenkin 的注释中加入关键字 fix #bug 就可以在SVN和Trac之间交叉引用,但是会这个bug的状态将变成fixed。 如果不想将bug的状态改变,需用关键字refs代替fix
交叉引用图例 交叉引用图例 • 使用refs关键字 • 使用fix关键字
TracLink使用参考 Tickets: #1 or ticket:1 Ticket comments: comment:1:ticket:2 Reports: {1} or report:1 Changesets: r1, [1], changeset:1 or (restricted) [1/trunk], changeset:1/trunk Revision log: r1:3, [1:3] or log:@1:3, log:trunk@1:3, [2:5/trunk] Diffs (requires 0.10): diff:@1:3, diff:tags/trac-0.9.2/wiki-default//tags/trac-0.9.3/wiki-default or diff:trunk/trac@3538//sandbox/vc-refactoring@3539 Parent page: [..] Milestones: milestone:1.0 Attachment: attachment:example.tgz (for current page attachment), attachment:attachment.1073.diff:ticket:944 Files: source:trunk/COPYING A specific file revision: source:/trunk/COPYING@200 A particular line of a specific file revision: source:/trunk/COPYING@200#L25
TracLink使用2参考 • Display: • * Tickets: #1 or ticket:1 • * Ticket comments: comment:1:ticket:2 • * Reports: {1} or report:1 • * Changesets: r1, [1],changeset:1 or (restricted) [1/trunk],changeset:1/trunk • * Revision log: r1:3, [1:3] or log:@1:3, log:trunk@1:3, [2:5/trunk] • * Diffs (requires 0.10): diff:@1:3, diff:tags/trac-0.9.2/wiki-default//tags/trac-0.9.3/wiki-default or diff:trunk/trac@3538//sandbox/vc-refactoring@3539 • * Parent page: .. • * Milestones: milestone:1.0 • * Attachment: attachment:example.tgz (for current page attachment), attachment:attachment.1073.diff:ticket:944 • (absolute path) • * Files: source:trunk/COPYING • * A specific file revision: source:/trunk/COPYING@200 • * A particular line of a specific file revision: source:/trunk/COPYING@200#L25