分类: 项目管理
2010-01-06 20:52:23
参考资料:
《使用Subersion进行版本控制》
针对 Subversion 1.1
/***20090510*****/
带着问题学习:
1,什么是SVN?
2,大致的原理?
3,据我所知的命令有:
1)svn checkout
2)svn update
3)svn commit
但是发生冲突的时候commit会把自己的修改擦掉吗?
刚开始工作的时候如果没有使用svn update那么如果之后使用得了commit会怎么样?
如果之后才使用svn update那么会怎么样?自己的修改还存在么?
4,我只想知道的功能:
0)怎样建立最初的svn工作环境?
1)导出服务器的工作目录到本机?
2)更新服务器的修改以便与本机的工作拷贝同步?
3)提交自己的修改到服务器,并且添加一些说明性的信息?
4)更新本机的拷贝到服务器中一个特定的版本?
5) 查看服务器上所有可用的版本的信息?
6)如何处理冲突?
7)从服务器捡出一个指定的版本到独立的一个工作拷贝?
8)在本地工作目录增加、删除了一个文件或者目录,如何让它与服务器的也同步?
9)一般程序员利用svn工作的日常步骤到底是怎么样的?
10)怎样更改文件的名字以及移动工作目录?
5,我好奇的功能:
1)svn checkout
2)svn update
3)svn copy
4)svn add
5)svn delete
6)svn commit
7)svn cat
============================
===============
===============
前面都是废话,这里是正题,慢慢地更新吧。
开始都是最简单的,往后随着应用以及兴趣,会更新。
===============
===============
============================
-----------------------------------------
一,些“术语”:
1,工作拷贝:
一个工作拷贝就是你本地机器的一个普通的目录,保存一些文件,你可以任意的编辑、编译它们,你的工作拷贝是你的私有工作区,Subversion不会自动把你的修改与其他人的合并,也不会把你的修改展示给别人。当你确定要“发布”自己的修改的时候,SVN会提供相应命令,这样你才能把你的工作和别人的工作合并,并使别人看到你的修改。
通常你的工作拷贝的每一个文件夹里有一个以".svn"为名的文件夹,它用来帮助Subversion来识别哪个文件作个修改,以及哪个文件已经过期等等。
------------------------------------------
二,基本命令
*获取帮助:
$svn help
*得到一个工作拷贝:
$svn checkout htttp://svn.example.com/repos/calc
这样你就有了一个/calc的个人拷贝,它是从:提取出来的。
*得到一个工作拷贝并放到你的新目录中:
$svn checkout subv
这样工作目录(拷贝)calc将放到你的新目录(subv)中。
SVN可以有多种不同方式访问的URL形式:
用来访问本地的
用来访问SVN的Apache的WebDAV协议
同上,不过用ssl加密
svn:// 用来访问SVN自定义的协议的的
svn+ssh:// 同上,不过用ssh封装
**提交你的修改:
*直接提交某个文件的修改:
$svn commit button.c
这样,你就会把自己对button.c的修改提交到服务器上去,提交后会使版本库的版本号加1,以后可通过指定号码恢复(其他人的工作拷贝需要他们自己请求更新,才会把服务器上新版本更新到本地,看到你的修改,可能出现的覆盖问题后面有解决方法).
*直接把所有修改的信息提交到版本库:
$svn commit
由于既没有--message(或-m),也没有--file来描述修改的信息,所以SVN会启用一个你喜欢的编辑器来编辑日志描述消息。如果写描述时想要取消提交,那么直接关闭编辑器,不要保存,然后在提示中选a即abort,(如果选的是c即continue,那么应该就会提交没有描述信息的修改);如果你保存了日志,那么只需要简单删掉所有文本,再次保存。
*提交时增加描述修改的日志信息:
$svn commit --message "add some infomation"
这里,--message可以简化为-m,后面接的是描述信息的字符串。如果描述信息很短,就可以这样直接再命令行中指定。如果信息多,就需要指定文件,见后面。
*提交时指定描述修改的日志文件:
$svn commit --file logmsg
这里,利用了--file,后面接的就是相应的日志文件。
**
*更新自己的工作拷贝:
$svn update
这样,将会把你的工作拷贝更新为服务器上最新的版本,看到其他人的修改。不用你自己指定,SVN会识别那些文件需要更新(可能出现的覆盖问题后面有解决方法)。该命令的输出信息将告诉你哪些文件被做了哪些修改到你的工作拷贝。
SVN对update和commit可能产生问题的解决:
1)若在工作拷贝里没做修改,且服务器版本库在工作拷贝版本之后也没被提交过其他修改;那么svn commit不做任何事,svn update不做任何事。
2)若在工作拷贝里做过修改,但服务器版本库在修改前工作拷贝的版本后没被提交过其他修改;那么svn commit会成功地提交(更新服务器版本库),svn update不做任何事。
3)若在工作拷贝里没做修改,但服务器版本库在工作拷贝版本之后被提交过其他修改;那么svn commit不做任何事,svn update会把你的工作拷贝版本更新为版本库中最新的。
4)若工作拷贝里做过修改,且服务器版本库在修改前工作拷贝的版本后被提交过其他修改;那么svn commit首先会失败并要求update,svn update会合并版本库和本地的修改,如果有冲突会询问用户去解决(,之后就继续了??网上答案说是需要手动commit)。
*检查自己的修改:
$svn status
这个命令不会和版本库通信,其显示的信息是告诉你你的当前工作拷贝将对服务器上的版本库作怎样的修改,在当前工作拷贝的顶级目录运行,默认将递归检查子目录上所有的文件,该命令和update不一样,但有些共通之处(指出了变化)。
*检查自己对某个文件的修改:
$svn status stuff/fish.c
和上面的命令一样,不过指定了一个特定的文件项,那么就仅显示该文件项的信息。
**关于对工作拷贝目录结构的修改:
你可以使用任何你喜欢的编辑工具编辑文件,但是你不可以在修改目录结构时不通知Subversion。
*为版本库添加一个新文件:
$touch foo
$svn add foo
这里,foo是待添加的文件。当然需要commit才会使版本库目录结构改变。先用普通linux命令在目录中建立了一个foo文件,然后通知svn要添加这个文件。如果foo是一个目录,那么svn默认会将foo目录下的所有文件也递归地添加进去(若仅添加目录不递归添加下面的文件需要使用-N参数)。
*在版本库删除一个文件:
$svn delete foo
这里,foo是待删除的文件。当然需要commit才会使版本库目录结构改变,不需要非得用linux普通命令将foo文件删除再进行,只用svn delete foo,意思是版本库中“逻辑上”把这个文件删除了,版本库中没有了这文件,而实际在普通的文件系统中还有这个文件,可以重新再添加进去,但是如果commit之后文件就从文件系统删除了。
*在版本库拷贝一个文件:
$svn copy foo bar
这里,建立一个foo的拷贝文件:bar。当然需要commit才会使版本库目录结构改变。不需要利用普通linux命令cp事先建立一个bar文件,会自动复制一份在文件系统中。
*在版本库移动一个文件:
$svn move foo bar
这里的例子相当于把文件foo重新命名为bar了。当然需要commit才会使版本库目录结构改变。不需要事先利用普通linux命令mv。
**关于历史版本:
*展示当前目录历史信息:
$svn log
这将展示项目各个版本的历史信息,每条记录信息包括谁、在什么时候、改了多少,以及相应的描述修改的日志信息。日志根据时间逆序排列。
*展示指定文件的历史:
$svn log foo.c
这将展示文件foo.c的历史信息。
*详细展示指定文件的历史:
$svn log --verbose foo.c
这样除了打印你所添加的信息之外还打印一些更为详细的信息比如哪些文件变了等。
*按特定顺序(或指定版本)展示历史信息:
$svn log -r 5:9
或$svn log --revision 9:5
或$svn log -r 8
这里用了--revision(即-r)选项,前两个分别按照时间顺序和逆序显示版本5和版本9之间的历史;最后一个显示版本8的历史。
注意有时候得到的是空信息,如:svn log -r 2
那不是错,那是说明当前目录在指定版本到现在没被修改过,可以用版本库顶级目录做为参数来查看。
如:svn log -r 2 ht
*查看最新的版本信息:
$svn log -r HEAD
这样,显示的是已经提交的最新修改的信息。
*使用带--revision的svn update和svn checkout来回到过去:
$svn checkout --revision 2
$svn update --revision 2
这会覆盖当前的目录版本吗?还是可以指定URL来提取一个独立的版本?
*得到一个指定时间的拷贝:
$svn checkout --revision {2002-09-08}
或$svn checkout --revision {15:30}
或$svn checkout --revision {20020908T1530}
等等。
这里将会提取出离指定时间最近的版本,需要注意的是,假设指定了2002-09-08很有可能2002-09-07的某个时间更近,因为默认是以日期的0点开始的。
*显示一段时间的版本历史信息:
$svn log -revision {2002-09-07}:{2009-09-08}
这会找到这个时间的所有历史版本,也可版本号和时期混用表示时间段,不过不推荐这样。
**
----------------------------
三,典型的工作周期:
1,更新你的工作拷贝:
$svn update
2,做出修改:
$svn add
$svn delete
$svn copy
$svn move
3,检验修改:
$svn status
$svn diff
$svn revert
4,合并别人的修改到你的工作拷贝:
$svn update
$svn resolved
5,提交你的修改:
$svn commit
---------------------------------
四、其他
一旦 commit, 这个文件在本地文件系统中就会被删除。
另外,SVN 的许多命令都有简写/别名,例如 checkout 可简写为 co,commit 可简写为 ci,等等。
在添加两个有用的命令,svn info 和 svn ann