前奏
svn作为一款极其优秀的开源版本控制系统,应用广泛,从组织到个人遍及各行各业。因此学习和熟练掌握它,对提高我们日常工作效率和数据安全非常重要,尤其对开发人员协同管理Project的文档,代码,各类图等,能达到事半功倍的效果。不必再每天完成工作后,打包工程目录,备份每天的版本;也不用几个人堆在一起效率低下地手工合计代码;也不用担心偶尔因忘记打包,而丢失宝贵的数据资料。现在笔者已经养成完全使用svn管理日常的一些小项目,即使是个人使用,因为实在是不想每次都打包了,然后找数据再去一堆压缩包里去找。
svn有Win和Linux的版本,这里讲的是后者,而且主要是命令行操作(不过通过命令行或者能更加理解svn的工作方式和原理),前者有乌龟这类图形工具,虽功能不全,但操作也确实简单。
需求分析
为了避免手工管理一个我们日益变大的项目,于是我们选择svn,让程序为我们自动控制版本并记录下更改记录。但每当使用import子命令将工程导入到svn时,我们遇到一个极其恶的问题:将本地的工程目录全部提交上去之后,但是这个原始工程目录却不是工作拷贝,于是我还得把这个原始工作目录删掉,重新从版本库中checkout出来一个拷贝。这太不爽了,暂且不论这个工程占多大磁盘空间,明明有这个工程,只是缺少版本控制信息,有必要就删掉而重新检出整个工程么。于是我在google再google,但始终没有找到解决方法,后来了解到,svn本来就没有考虑过这个问题,貌似就只能删掉原始工程目录,而重新从库中检出一个带版本控制信息的一模一样的工程。
Solution
可能是因为个人有某种强迫症,偶还是一如继往地寻找方法企图解决这个问题,现在终于使用了一个小技巧搞定了,目前市场上还没有见到过这种方法,完全自创哦。方法如下(依然以最经典的helloworld工程为例)
:
1. cd进入helloworld工程所在目录
2. 递归导入工程到版本库:
svn import helloworld
svn://localhost/project -m "Just Test this Trick."
3.
执行最关键的命令(参数--depth=empty是精髓,它只初始化版本控制信息,不检出任何文件):
svn co --depth=empty
svn://localhost/project helloworld
4. 然后进入工程目录:
cd helloworld
5.
执行命令:
svn st
然后显示所有文件前全带?号,因为此时这些文件还不在版本控制管辖范围内。
6. 因此我们将它们全部加入:
svn
add *
现在所有文件前全显示为A标记,即为Add状态。
7.
为了与版本库一致,执行update命令(其实此时这些文件与现在版本库中是一模一样的,因为我们才刚刚提交完,没有作任何更改,此举是为了“骗过”svn):
svn
up *
此时更新必然会有冲突,而且还是100%,程序提示“在 “xxx” 中发现冲突。选择: (p) 推迟,(mf) 全用我的,(tf)
全用他人的,(h) 使用帮助以得到更多选项:”,这时我们一定要选“(mf) 全用我的“,即输入mf,否则我们前面的工作就没有意义了。
8.
这时再用如下命令:
svn st
svn ci
命令均无显示,因为无状态变化,现在这个原始工程已经“转变“成一个work
copy了。现在开始工作吧^_^。
--------------------------------俺是分隔线----------------------------------------
以下是我个人曾经的学习笔记,很乱,如果能用上,则看看,高手们就忽略掉它的存在吧。
http://www.subversion.org.cn/svnbook
http://subversion.tigris.org/faq.zh.html
sudo
apt-get install subversion
#sudo apt-get install
libapache2-svn(这个是和apache配合使用的,如果不打算使用apache则可不安装)
完成安装后,给系统添加一个用户组(如svn),把想要加入这个组的加一下(至少要把你自己加进吧)
#
Add group
sudo addgroup svn
# Append user z as the supplemental Groups to
group svn
sudo usermod -G svn -a z
cd svnroot/
mkdir
zigbee_paper
sudo chown -R root:svn zigbee_paper/
sudo svnadmin create
/home/z/public/share/svnroot/zigbee_paper/
$ svnserve -d --foreground -r
/home/svn
# -d -- daemon mode
# --foreground -- run in foreground (useful
for debugging)
# -r -- root of directory to serve
# svnserve --daemon
--root=#SVNPATH/repos
--listen-port=3690
注:不推荐使用root用户启动服务,默认端口号为3690
设置为随系统自动启动
编写启动脚本文件,命名为svn,放到
/etc/init.d/ 中
#!/bin/sh
# de