-
Apache HTTP Server
-
安装
-
自动安装
- 停止IIS
- 运行 apache_2.2.11-win32-x86-openssl-0.9.8i.msi
-
手动安装
- 【安装服务】D:\Program Files\Apache Software Foundation\Apache2.2\bin>httpd -k install
-
启动
- 使用系统托盘的Monitor控制Apache服务
-
【用命令行启动】D:\Program Files\Apache Software Foundation\Apache2.2\bin>httpd -k start
- 加入“-e debug”选项可得到详细启动信息 例:httpd -k start -e debug
- 【用命令行关闭】D:\Program Files\Apache Software Foundation\Apache2.2\bin>httpd -k stop
-
配置
-
D:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf
- 【端口号】Listen 8080 (46行)
-
测试
- http://172.16.75.77:8080/
- http://127.0.0.1:8080/
- http://localhost:8080/
-
下载 SVN
-
官网:http://subversion.tigris.org/
-
CollabNet Subversion
- CollabNet Subversion是Subversion的一个企业级产品发布包,包括经过验证测试的运行包、在不同操作系统下的安装包和其他经认证的集成插件,例如与Eclipse, HP Quality Center,以及 IBM Rational ClearCase等的集成插件
-
slik svn
- provide a standalone command line Subversion package for Windows. The installer contains all command line tools (svn, svnadmin, svnsync, svnserve, svnmucc, etc.) but no application bindings nor Apache modules. The tools are fully side-by-side compatible with other packages. Ideal for automated build and deploy scripts.
-
VisualSVN Server
- 非常的方便,只要简单的进行安装,就可以建立起一个 SVN 服务器。
- http://www.visualsvn.com/server/download/
-
可视插件
- CollabNet Desktop,基于CollabNet Subversion,含VS插件 (http://www.collab.net/downloads/desktops/)
- AnkhSVN:VisalStudio 插件(http://ankhsvn.open.collab.net/servlets/ProjectProcess?pageID=3794)
- VisualSVN: VisalStudio 插件,基于TortoiseSVN(http://www.visualsvn.com/visualsvn/download/)
- TortoiseSVN:Windows 资源管理器插件(http://tortoisesvn.net/downloads)
-
CollabNet Subversion
-
安装
- 程序:D:\Program Files\CollabNet Subversion Server
- 资源库:F:\SVN\CollabNetSVN\svn_repository
-
配置Apache服务
- 将D:\Program Files\CollabNet Subversion Server\httpd\modules 里面的mod_dav_svn.so和mod_authz_svn.so复制到D:\Program Files\Apache Software Foundation\Apache2.2\modules
- 将 D:\Program Files\CollabNet Subversion Server 里面的libdb41.dll、libeay32.dll、ssleay32.dll复制到D:\Program Files\Apache Software Foundation\Apache2.2\modules
-
修改D:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf
- 取消这两行的注释:
LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so
- 追加:
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
- 在文件的最后追加:
<Location /svn>
DAV svn
SVNParentPath F:\SVN\CollabNetSVN\svn_repository
</Location>
-
重启Apache服务
- 如果无法启动,试试重新启动计算机!
- 测试:http://172.16.75.77:8080/svn/1-2-3/
-
【访问控制】
-
创建密码文件
- D:\Program Files\Apache Software Foundation\Apache2.2\bin>htpasswd -cm F:\SVN\CollabNetSVN\passwd.txt wdl
D:\Program Files\Apache Software Foundation\Apache2.2\bin>htpasswd -m F:\SVN\CollabNetSVN\passwd.txt jcl
D:\Program Files\Apache Software Foundation\Apache2.2\bin>htpasswd -m F:\SVN\CollabNetSVN\passwd.txt yy
- -c 表示创建文件,-m 表示MD5加密
-
创建访问控制文件:F:\SVN\CollabNetSVN\accessfile.txt
[1-2-3:/]
jcl = rw
wdl = r
yy = rw
[1-2-3:/NBA]
yy=
- "yy=" 表示yy没权限访问NBA中的文件
- 也可以先把用户分组,例如:
[groups]
department_1 = username1, username2
department_2 = username3, username4, username5
[1-2-3:/NBA]
@department_1 = r
@department_2 = rw
- 修改httpd.conf:
<Location /svn>
DAV svn
SVNParentPath F:\SVN\CollabNetSVN\svn_repository
AuthName "Subversion repository"
AuthzSVNAccessFile F:/SVN/CollabNetSVN/accessfile.txt
Require valid-user
Satisfy Any
# The following is Basic authentication setting
AuthType Basic
AuthUserFile F:/SVN/CollabNetSVN/passwd.txt
</Location>
-
命令行
-
D:\Program Files\CollabNet Subversion Server\SVN.exe
-
初始
- 【创建文件夹】svnadmin create
- svnadmin create F:/SVN/CollabNetSVN/svn_repository/1-2-3
- 【初始导入目录进行版本管理】svn import
- D:\Program Files\CollabNet Subversion Server>svn import E:/1-2-3 file:///F:/SVN/
CollabNetSVN/svn_repository/1-2-3 -m "init import"
- -m 用作添加Log Msg。如果不加这个参数会提示你是否继续,并且打开一个文本编辑器(在SVN_EDITOR环境变量中设置,如果未设置会报错),有你写入信息并保存
- 【初始签出】svn checkout
- svn checkout file:///F:/SVN/CollabNetSVN/svn_repository/1-2-3 E:/1-2-3
- E:\1-2-3 应为空目录
- E:\1-2-3\每个文件夹下都会有一个“.svn”目录
- 【列出资源库中的文件】svn list
- svn list file:///F:/SVN/CollabNetSVN/svn_repository/1-2-3
- svn list -R file:///F:/SVN/CollabNetSVN/svn_repository/1-2-3
-R 表示递归遍历子目录
-
日常工作
- 【获取最新版本】svn update
- E:\1-2-3>svn update
- 【签出】svn checkout
- 【签入】svn commit
- 【修改文件内容】
- 修改文件内容、保存即可
- 【修改目录结构或添加、删除文件】
- 【添加文件】
- E:\1-2-3>svn add 试验.txt
- 之后再执行 svn commit 才正式提交到资源库
- 这时其它人使用 svn update 就能获取这个新文件了
- 【添加新目录】
- E:\abc>svn add nba
- 如果只想添加一个空目录而不想包含目录中的文件和子文件夹,要使用--non-recursive (-N) 参数
- 如果之前已经add 过这个叫做 nba的目录,再次执行 svn add nba 的命令会报错,可使用 svn add nba --force 参数强制新增
- 【删除文件】
- E:\1-2-3>svn delete 试验.txt
- 本地文件会立即删除,资源库在执行了 svn commit 之后被更新
- 【删除目录】
- E:\abc>svn delete nba
- 本地目录 nba 中的文件会被立即删除,但是目录结构还保留
- 执行 svn commit 之后目录结构也被删除
- 【复制目录】
- svn copy cr haha
- 相当于 先用Windows资源管理器复制cr、粘贴为haha,再使用 svn add haha
- 【移动目录】
- svn move foo bar
- 相当于 svn copy foo bar; svn delete foo
- 【创建目录】
- svn mkdir blort
- 相当于 mkdir blort; svn add blort
- 也可以直接操作资源库中的文件和目录,这时就不需svn commit命令了
- svn delete file:///F:/SVN/CollabNetSVN/svn_repository/1-2-3/5.jpg -m aaa
- 【查看修改状态】
- svn status
- 将本地文件与最近一次执行svn update时获取的版本进行比较
- svn status -u
- 将本地文件与资源库中的最新版本进行比较
- 结果说明
- C 不在SVN管理下的文件
A 新增的文件
C 冲突的文件
M 修改过的文件
D 被删除的文件
* 如果出现*这个标记说明资源库版本比上次获取的版本高,有发生冲突的可能。这时会不允许签入,而是需要先 svn update 已确定是否真有冲突。
- 【版本冲突、解决】
- 产生冲突的例子
- phone.txt 的内容在张三、李四和资源库中一致(此时版本号为21)
- phone.txt 的内容:
111
222
- 张三修改 phone.txt ,并签入(此时版本号为22)
- phone.txt 的内容:
111
1.5
222
- 李四修改 phone.txt
- phone.txt 的内容:
111
aaa
222
- 李四执行 svn status -u 会发现 phone.txt被标记为“*”,表示资源库版本比上次获取的版本高,有冲突的可能。这时会不允许签入,必须先执行 svn update
- 李四执行 svn update
- 提示 phone.txt 有冲突,选择 “p” (推迟)。这时文件变为:
- phone.txt 内容:
111
<<<<<<< .mine
aaa
=======
1.5
>>>>>>> .r22
222
- phone.mine 内容:
111
aaa
222
- 李四修改后的文件
- phone.r21 内容:
111
222
- 李四修改前的文件(前一版本)
- phone.r22 内容:
111
1.5
222
- 资源库中的最新版本
- 解决冲突
- 第一种选择:提交带有冲突信息的 phone.txt
- 适用于李四想让张三解决冲突的情况
- 缺点:岂不是会造成phone.txt无法编译?
- 操作方法
- svn resolve --accept working phone.txt
- 此操作将删除 phone.mine、phone.r21 和 phone.r22 这三个文件
- svn commit -m 我们冲突了,咋办?
- 之后版本号变为了23
- 之后由张三获取最新版本的phone.txt,然后决定保留“aaa”还是“1.5”,然后再次提交修改
- 第二种选择:丢弃自己的修改
- 操作方法
- svn resolve --accept theirs-full phone.txt
- 此操作将删除 phone.mine、phone.r21 和 phone.r22 这三个文件,并将phone.txt内容变成资源库的最新版本
- 另一个更简单的命令是:svn revert phone.txt
- 第三种选择:丢弃别人的更改
- 操作方法
- svn resolve --accept mine-full phone.txt
- 此操作将删除 phone.mine、phone.r21 和 phone.r22 这三个文件,并将phone.txt内容变成与phone.mine一样
- 缺点:张三并不知道自己的变更被覆盖了。张三以后会很迷惑,知道自己的修改被偷偷丢弃了会很生气,后果很严重。
- 【推荐】第四种选择:手工修改phone.txt
- 恰好两个人修改了同一个函数的情况比较少见,一般都是恰好添加或删除的文本位置有重叠。所以大部分情况下可以发现大家只是恰好都在第2行添加了一个函数,这时只要把自己的修改追加到别人的修改的后面就行了
- 使用TortoiseSVN(资源管理器插件)的“Edit Conflict”的可视化功能,可以更方便得完成这一工作
- svn resolve --accept working phone.txt
- 此操作将删除 phone.mine、phone.r21 和 phone.r22 这三个文件
- svn commit
- 【历史版本】
- 查看历史版本
- 查看历史Log Msg:svn log
- 查看版本为21的 phone.txt:svn cat -r 21 phone.txt
- 【将版本为13的 phone.txt临时保存为nn.txt】
- svn cat file:///F:/SVN/CollabNetSVN/svn_repository/1-2-3/phone.txt@13 > nn.txt
- 比较21和22版的不同: svn diff -r 21:22 phone.txt
- 回到历史版本
- svn update -r 10
- svn update -r {2009-4-16}
- svn update -r {"2009-4-16 16:10:00"}
- svn checkout 也可使用 -r 参数
- 【导出(不带.svn目录)】
- svn export file:///F:/SVN/CollabNetSVN/svn_repository/1-2-3 e:/qqq
- 【清理】
- 当执行 svn update 操作时,svn的操作方法是先把要做的更改写进一个Log文件里,然后锁定要更改的文件,然后根据Log文件做更改。如果做这些操作时进程意外挂掉,或突然断电,会有一些文件一直处于锁定状态(使用svn status 时这些文件会被标记为“L"),这时应该使用 svn cleanup 命令
- 【找回删除的文件】
- 使用svn log -v 查看文件或目录是在哪个版本删除并提交的
- svn copy file:///F:/SVN/CollabNetSVN/svn_repository/1-2-3/NBA@7 NBA
- ”@“后面是版本号,应该是删除并提交的版本号-1
- 注意路径和文件名区分大小写
- svn commit
-
备份
- 完全备份
- 【备份】svnadmin dump F:\SVN\CollabNetSVN\svn_repository\1-2-3 > F:\SVN\bak\123090421.dump
- 【恢复】
- 先在F:\SVN\repo\1-2-3创建一个资源库
- svnadmin load F:\SVN\repo\1-2-3 < F:\SVN\bak\123090421.dump
- 使用任务计划自动备份
- 创建一个叫做svndump.bat的批处理文件:
svnadmin dump F:\SVN\CollabNetSVN\svn_repository\1-2-3 > F:\SVN\bak\123_%date:~2,2%%date:~5,2%%date:~8,2%.dump
- 创建一个Windows的任务计划,执行这个svndump.bat
-
SVN服务
-
windows服务:svnserve
- CollabNetSVN 和 sliksvn(完全安装)都提供了叫做svnserve.exe的Windows服务
-
临时运行一下
- svnserve -d -r F:\SVN\CollabNetSVN\svn_repository
-
安装为Windows服务
- sc create svnserve binpath= "\"D:\Program Files\SlikSvn\bin\svnserve.exe\" --service -r F:\SVN\CollabNetSVN\svn_repository" displayname= "Subversion Server" depend= Tcpip start= auto
-
删除此Windows服务(如果需要重装)
- sc delete svnserve
-
设置权限
- 默认是只读的
-
配置文件
- F:\SVN\CollabNetSVN\svn_repository\1-2-3\conf\svnserve.conf
[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
- 注意:配置文件每一行(例如anon-access=none)前面都不能有空格!否则会报“Option expected”的错误
- F:\SVN\CollabNetSVN\svn_repository\1-2-3\conf\passwd
[users]
jcl = jjjjjj
yy = 123
wdl = 123
- F:\SVN\CollabNetSVN\svn_repository\1-2-3\conf\authz
[1-2-3:/]
jcl = rw
wdl = r
yy = rw
[1-2-3:/NBA]
yy=
-
重启服务,之后再访问时就会提示需要用户名和密码
- TortoiseSVN 清除缓存的密码的方法:Windows资源管理器右键菜单|TortoiseSVN|Settings|Saved Data|点击“Authentication Data”右侧的“Clear”按钮
-
访问路径
- svn://172.16.75.77/1-2-3
- Apache 服务
-
使用规范
-
管理员
-
排除Bin文件夹和.suo文件
-
设置客户端ignore属性
- TortoiseSVN
- bin上右击,TortoiseSVN|Delete and Add to ignore list
- 相当于先在为bin的父目录添加一个svn:ignore属性,属性的值是“bin”,再把bin从资源库中删除
- 命令行
- svn propset svn:ignore bin cncalweb
- svn delete bin
- svn commit
- 运行程序重新生成bin目录,或者把在第二步之前备份的bin目录Copy回来
-
可以考虑将特定类型的文件设为“锁定-修改-解锁”的模式
- 例如像.aspx这种文件,如果修改就可能会是修改了第2、10、15、22、36行,也就是说修改的点会比较分散,如果发生冲突不太好解决,可以考虑把这种文件设为“锁定-修改-解锁”模式
- 方法(TortoiseSVN):选中所有的.aspx文件,添加一个名为“svn:needs-lock”,值为“*”的属性。缺点是每次添加新的页面文件都要手动设置,比较麻烦,也容易忘
-
文件夹布局
-
资源库
- 项目名称
- trunk
- code
- doc
- branches
- tags
-
普通用户
- 每天开始工作前必须先获取最新版本
- 完成工作并编译无错后,要尽快签入
- 不允许签入未通过编译的代码
- 在签入之前应先进行Check for modifications操作,查看都有哪些文件被自己修改过, 确保不会签入意外修改的文件。
-
发生冲突时,要先解决冲突、编译无错后再签入
-
解决冲突的3个选择
- 1. 撤销自己的修改(适用于不想保存自己的修改的情况,例如是意外的修改或试验性的修改)
- 2. 将自己的修改追加到他人的修改之后(适用于两个人在文件的同一位置追加了代码的情况)
- 3. 与发生冲突的程序员沟通,决定如何解决冲突(适用于两个人修改了同一段代码的情况)
- 签入时应填写描述信息