在非 Windows 的平台上, Subversion 可以版本化一个符号链接,一个符号链接是对文件系统中另一个对象的透明引用,通过对符号链接的操作,可以实现对对象的修改
SVN 中常用来修改目录结构的 5 个命令:
1. svn add foo
将文件,目录或符号链接 foo 添加到版本库,当你下次 commit 后, foo 会成为其父目录的一个子对象,注意: 如果 foo 为目录,则其下的内容也会被调度增加。如果只想添加 foo 本身,加选项 - - non – recursive (- N)
2. svn delete foo
如果 foo 是文件或符号链接,马上在工作副本中删除, 如果 foo 是目录则不会。 SVN 会调度删除,当你提交修改后, foo 就会在工作副本和版本库中删除
3. svn copy foo bar
创建 bar 作为 foo 的 copy , 在下次 commit 时添加到版本库,这种复制会记录历史,即 bar 有 foo 的历史
4. svn move foo bar
这个命令与 svn copy foo bar; svn delete foo 操作效果相同
5. svn mkdir blort
这个命令与 svn add blort 相同,调度增加到版本库
不通过工作副本修改版本库
有些操作会立刻提交目录树的修改到版本库,这只发生在子命令直接操作 URL 时,而不是工作副本路径
以特定的方式使用 svn copy, svn move, svn delete, svn mkdir 可以针对 URL 操作(注意 svn import 只针对 URL )
svn status 浏览做过的修改
svn diff 检查修改的详细信息
同时,可以在没有网络的情况下使用 svn status, svn diff, svn revert 命令(这是版本库是网络链接而不是本地的)
svn status 命令的一些状态符号表示
A 将会被加入到版本库
C 将会发生冲突
M 修改会提交
D 将被删除
在 svn status 中的一个参数 - - verbose(-V), 显示工作目录下的所有项目,即使没有修改
显示的内容包括,状态, 当前版本号, 最后一次修改版本号, 修改人, 文件名
同时,这时的 svn status 命令并没有与版本库交互信息,只是利用了 .svn 目录下的数据进行的比较。
可以使用参数 - - show-updates(-u) 选项, 它将会联系版本库,更新过时数据
svn diff 命令
svn diff 不带参数的话,会精确的找出你所做的修改,并输出修改的信息
这些修改信息中,包括,修改的文件,修改的行,行的内容,这里修改指(-删除,+增加)
同时,可以通过管道 svn diff > modifyInfo 把修改信息输出到文件。
Subversion 使用的内置的差异引擎,你也可以选用外置的比较程序 , 使用 - - diff-cmd 选项来指定外置比较程序,并可以通过选项 - - extensions(-x) 来传递其他参数。
比如,查看文件 foo.c 的修改,并忽略大小写,可以
svn diff - -diff-cmd /usr/bin/diff –x “-i“ foo.c
取消修改 svn revert
svn revert item
命令把 item 与 .svn 文件中的原始信息比较,可以还原到原始未修改的状态
使用 svn delete item; svn update –r BASE item 一样可以达到目的,但是 svn revert 不需要连接版本库。
使用 svn update 命令碰到 Confict 时,会提供一些操作:
(p) postpone, (df) diff-full, (e) edit,
(h) help for more options:
使用 h 可以得到所有操作的详细解释,如:
(p) postpone - mark the conflict to be resolved later 让文件更新后,保持冲突状态
(df) diff-full - show all changes made to merged file 显示冲突的信息
(e) edit - change merged file in an editor 使用编辑器打开冲突文件,编辑器是在环境变量 EDITOR 设置的
(r) resolved - accept merged version of file 已经解决冲突,版本库接受当前本地内容
(mf) mine-full - accept my version of entire file (ignore their hanges) 使用本地版本,忽略冲突
(tf) theirs-full - accept their version of entire file (lose my changes) 使用版本库中内容,丢弃本地修改
(l) launch - launch external tool to resolve conflict 打开外部工具,来解决冲突,通过环境变量 SVN_MERGE 设置,或者在 Subversion 配置文件中定义 merge-tool-cmd 选项
(h) help - show this list
在出现冲突后, commit 会失败,会在本地产生三个临时文件,为 file.mine, file.rOLDDEV
file.rNEWDEV 其中 OLDDEV 是上次更新时的版本号, NEWDEV 是现在版本库中版本号
可以使用 svn resolv 命令来解决冲突
使用 ―― accept 选项,参数包括
base: 使用上次更新时的版本
mine-full 使用本地修改后的版本
theirs-full 使用版本库中现在的版本
resolve 成功后, 3 个临时文件会被删除
在 svn commit 时,一般都会使用- m 选项,带上 comment ,也可以使用―― file (- F )选项,表示从文件中读取 comment : eg: svn commit –F logmsg
当你 2 个选项都不使用时,会自动打开你默认的 EDITOR ,让你输入 comment ,这时如果你不想 commit 了,可以不保存文件,退出;如果你保存了你输入的 msg ,这时删除 text ,然后 abort
从版本库得到历史数据的命令:
svn log
这个命令显示每个版本被修改的文件,路径,修改人,时间, comment
svn log 在 svn commit 之后马上运行的话,不会见到刚刚的提交的 log
因为,刚刚的提交只是修改的版本库中 file 或目录的 revision ,但是其 parent 目录的 revision 还是 old , svn log 会找目录当前的 revision ,到了 parent 没有发现,就不会找下去了
可以使用 svn update 之后再 svn log 就可以看到了, 或者 使用 - - revision ( -r )选项
使用 - - verbose ( -v )选项,可以显示这个 revision 被修改的文件
Eg: svn log –r 8 –v
r8 | sally | 2008-05-21 13:19:25 -0500 ( Wed, 21 May 2008 ) | 1 line
Changed paths:
M /trunk/code/foo.c
M /trunk/code/bar.h
A /trunk/code/doc/README
Frozzled the sub-space winch.
使用 - -quiet(-q) 选项可以缩减显示的 log 信息,如果与 - - verbose 一起连用的话,会只显示修改的文件的文件名,而不是完整路径
有时使用 svn log 时没有任何信息输出, 如 svn log –r 2
可能是因为,你在本地工作副本的某个子目录中,而这个子目录下的所有文件都没有被修改过,则 svn log –r 2 显示不了任何信息,最好在最上层目录使用
svn diff 命令用来比较文件
1. 比较本地文件与 .svn 中的信息
2. 比较本地文件与版本库中的
3. 比较版本库中的版本
svn diff 用来比较本地文件中被修改的那些
svn diff -r 3 rules.txt 用来将本地文件与版本库中指定版本 3 的比较
svn diff -r 2:3 rules.txt 比较版本库中版本 2 与版本 3
svn diff -c 3 rules.txt 比较版本 3 与之前一个版本, -c 是 - - change 的短写
同樣即時本地沒有工作副本,也可以比較版本庫中修訂版本,只要提供 URL
svn diff -c 5 http://svn.example.com/repos/example/trunk/text/rules.txt
svn cat 可以用來查看某個版本 , 而不是比較
svn cat -r 2 rules.txt
svn list 查看目錄下的文件 ( 默認是訪問版本庫中文件信息 , 而不是本地工作目錄 )
詳細信息 , 使用 - -verbose(-v)
svn export 作用?????沒看懂
Lastly, if you're building a release and wish to bundle up your files from Subversion but don't want those pesky .svn directories in the way, you can use svn export to create a local copy of all or part of your repository sans .svn directories. As with svn update and svn checkout , you can also pass the --revision ( -r ) option to svn export :
$ svn export http://svn.example.com/svn/repos1 # Exports latest revision
…
$ svn export http://svn.example.com/svn/repos1 -r 1729
SVN 對本地工作副本更新的操作 (update) 步驟 :
1. 把要更新的內容寫到一個臨時的 log file 中
2. 對本地的工作副本進行 lock ,防止其他 subversion server 對文件的訪問
3. 更新
4. 刪除 log file
如果在操作的時候,發生中斷,這是 log file 會留在 disk 上,同時本地工作副本還在 lock 中,這是需要 svn cleanup 命令來進行處理,它會完成 log file 中的任務,同時解鎖,之前如果使用 svn status 來查看文件狀態,會見到 L