1. Apache HTTP Server
    1. 安装
      1. 自动安装
        1. 停止IIS
        2. 运行 apache_2.2.11-win32-x86-openssl-0.9.8i.msi
      2. 手动安装
        1. 【安装服务】D:\Program Files\Apache Software Foundation\Apache2.2\bin>httpd -k install
    2. 启动
      1. 使用系统托盘的Monitor控制Apache服务
      2. 【用命令行启动】D:\Program Files\Apache Software Foundation\Apache2.2\bin>httpd -k start
        1. 加入“-e debug”选项可得到详细启动信息 例:httpd -k start -e debug
      3. 【用命令行关闭】D:\Program Files\Apache Software Foundation\Apache2.2\bin>httpd -k stop
    3. 配置
      1. D:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf
        1. 【端口号】Listen 8080 (46行)
    4. 测试
      1. http://172.16.75.77:8080/
      2. http://127.0.0.1:8080/
      3. http://localhost:8080/
  2. 下载 SVN
    1. 官网:http://subversion.tigris.org/
      1. CollabNet Subversion
        1. CollabNet Subversion是Subversion的一个企业级产品发布包,包括经过验证测试的运行包、在不同操作系统下的安装包和其他经认证的集成插件,例如与Eclipse, HP Quality Center,以及 IBM Rational ClearCase等的集成插件
      2. slik svn
        1. 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.
      3. VisualSVN Server
        1. 非常的方便,只要简单的进行安装,就可以建立起一个 SVN 服务器。
        2. http://www.visualsvn.com/server/download/
      4. 可视插件
        1. CollabNet Desktop,基于CollabNet Subversion,含VS插件 (http://www.collab.net/downloads/desktops/)
        2. AnkhSVN:VisalStudio 插件(http://ankhsvn.open.collab.net/servlets/ProjectProcess?pageID=3794)
        3. VisualSVN: VisalStudio 插件,基于TortoiseSVN(http://www.visualsvn.com/visualsvn/download/)
        4. TortoiseSVN:Windows 资源管理器插件(http://tortoisesvn.net/downloads)
        5. Subclipse:Eclipse插件
          1. 下载Subclipse:http://subclipse.tigris.org/
          2. 当前版本:Subclipse 1.6.x,支持Eclipse 3.x和Subversion1.6.x,下载的ZIP版文件名为site-1.6.2.zip
          3. 安装
          4. 将site-1.6.2.zip解压缩
          5. 打开EOS Studio,点选菜单“帮助|软件更新|查找并安装...”,点选“搜索要安装的新功能部件”,下一步,点选“新建本地站点...”,路径选择上一步解压的site-1.6.2.zip的文件夹。接着一路下一步就可以
        6. 一个基于SubClipse的为普元开发的SVN插件
          1. 下载和安装说明:http://www.scmlife.com/dp-bbsthread-13989.html
          2. 安装
          3. 将com.primeton.studio.workbench.team.svn.1.0.0.jar拷贝到eclipse的plugin目录下,并删除eclipse下的configuration目录下的a)org.eclipse.osgics b)org.eclipse.updatec 两个目录,然后重启EOS Studio
          4. 进入EOS Studio的“EOS开发”透视图的“项目资源管理器”,在项目的根目录上右击,点选“小组|共享项目...”,然后选择“SVN”,下一步,完成。
          5. 配置、使用
          6. 配置SVN选项:EOS Studio 菜单“窗口|首选项...|小组|SVN”
          7. 日常使用EOS Studio的“EOS开发”透视图的“项目资源管理器”,在项目的目录或文件上右击,点选“小组”之后的功能菜单
  3. CollabNet Subversion
    1. 安装
      1. 程序:D:\Program Files\CollabNet Subversion Server
      2. 资源库:F:\SVN\CollabNetSVN\svn_repository
    2. 配置Apache服务
      1. 将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
      2. 将 D:\Program Files\CollabNet Subversion Server 里面的libdb41.dll、libeay32.dll、ssleay32.dll复制到D:\Program Files\Apache Software Foundation\Apache2.2\modules
      3. 修改D:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf
        1. 取消这两行的注释: LoadModule dav_module modules/mod_dav.so LoadModule dav_fs_module modules/mod_dav_fs.so
        2. 追加: LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule authz_svn_module modules/mod_authz_svn.so
        3. 在文件的最后追加: <Location /svn> DAV svn SVNParentPath F:\SVN\CollabNetSVN\svn_repository </Location>
        4. 重启Apache服务
          1. 如果无法启动,试试重新启动计算机!
        5. 测试:http://172.16.75.77:8080/svn/1-2-3/
      4. 【访问控制】
        1. 创建密码文件
          1. 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
          2. -c 表示创建文件,-m 表示MD5加密
        2. 创建访问控制文件:F:\SVN\CollabNetSVN\accessfile.txt [1-2-3:/] jcl = rw wdl = r yy = rw [1-2-3:/NBA] yy=
          1. "yy=" 表示yy没权限访问NBA中的文件
          2. 也可以先把用户分组,例如: [groups] department_1 = username1, username2 department_2 = username3, username4, username5 [1-2-3:/NBA] @department_1 = r @department_2 = rw
        3. 修改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>
    3. 命令行
      1. D:\Program Files\CollabNet Subversion Server\SVN.exe
        1. 初始
          1. 【创建文件夹】svnadmin create
          2. svnadmin create F:/SVN/CollabNetSVN/svn_repository/1-2-3
          3. 【初始导入目录进行版本管理】svn import
          4. D:\Program Files\CollabNet Subversion Server>svn import E:/1-2-3 file:///F:/SVN/ CollabNetSVN/svn_repository/1-2-3 -m "init import"
          5. -m 用作添加Log Msg。如果不加这个参数会提示你是否继续,并且打开一个文本编辑器(在SVN_EDITOR环境变量中设置,如果未设置会报错),有你写入信息并保存
          6. 【初始签出】svn checkout
          7. svn checkout file:///F:/SVN/CollabNetSVN/svn_repository/1-2-3 E:/1-2-3
          8. E:\1-2-3 应为空目录
          9. E:\1-2-3\每个文件夹下都会有一个“.svn”目录
          10. 【列出资源库中的文件】svn list
          11. svn list file:///F:/SVN/CollabNetSVN/svn_repository/1-2-3
          12. svn list -R file:///F:/SVN/CollabNetSVN/svn_repository/1-2-3 -R 表示递归遍历子目录
        2. 日常工作
          1. 【获取最新版本】svn update
          2. E:\1-2-3>svn update
          3. 【签出】svn checkout
          4. 【签入】svn commit
          5. 【修改文件内容】
          6. 修改文件内容、保存即可
          7. 【修改目录结构或添加、删除文件】
          8. 【添加文件】
          9. E:\1-2-3>svn add 试验.txt
          10. 之后再执行 svn commit 才正式提交到资源库
          11. 这时其它人使用 svn update 就能获取这个新文件了
          12. 【添加新目录】
          13. E:\abc>svn add nba
          14. 如果只想添加一个空目录而不想包含目录中的文件和子文件夹,要使用--non-recursive (-N) 参数
          15. 如果之前已经add 过这个叫做 nba的目录,再次执行 svn add nba 的命令会报错,可使用 svn add nba --force 参数强制新增
          16. 【删除文件】
          17. E:\1-2-3>svn delete 试验.txt
          18. 本地文件会立即删除,资源库在执行了 svn commit 之后被更新
          19. 【删除目录】
          20. E:\abc>svn delete nba
          21. 本地目录 nba 中的文件会被立即删除,但是目录结构还保留
          22. 执行 svn commit 之后目录结构也被删除
          23. 【复制目录】
          24. svn copy cr haha
          25. 相当于 先用Windows资源管理器复制cr、粘贴为haha,再使用 svn add haha
          26. 【移动目录】
          27. svn move foo bar
          28. 相当于 svn copy foo bar; svn delete foo
          29. 【创建目录】
          30. svn mkdir blort
          31. 相当于 mkdir blort; svn add blort
          32. 也可以直接操作资源库中的文件和目录,这时就不需svn commit命令了
          33. svn delete file:///F:/SVN/CollabNetSVN/svn_repository/1-2-3/5.jpg -m aaa
          34. 【查看修改状态】
          35. svn status
          36. 将本地文件与最近一次执行svn update时获取的版本进行比较
          37. svn status -u
          38. 将本地文件与资源库中的最新版本进行比较
          39. 结果说明
          40. C 不在SVN管理下的文件 A 新增的文件 C 冲突的文件 M 修改过的文件 D 被删除的文件 * 如果出现*这个标记说明资源库版本比上次获取的版本高,有发生冲突的可能。这时会不允许签入,而是需要先 svn update 已确定是否真有冲突。
          41. 【版本冲突、解决】
          42. 产生冲突的例子
          43. phone.txt 的内容在张三、李四和资源库中一致(此时版本号为21)
          44. phone.txt 的内容: 111 222
          45. 张三修改 phone.txt ,并签入(此时版本号为22)
          46. phone.txt 的内容: 111 1.5 222
          47. 李四修改 phone.txt
          48. phone.txt 的内容: 111 aaa 222
          49. 李四执行 svn status -u 会发现 phone.txt被标记为“*”,表示资源库版本比上次获取的版本高,有冲突的可能。这时会不允许签入,必须先执行 svn update
          50. 李四执行 svn update
          51. 提示 phone.txt 有冲突,选择 “p” (推迟)。这时文件变为:
          52. phone.txt 内容: 111 <<<<<<< .mine aaa ======= 1.5 >>>>>>> .r22 222
          53. phone.mine 内容: 111 aaa 222
          54. 李四修改后的文件
          55. phone.r21 内容: 111 222
          56. 李四修改前的文件(前一版本)
          57. phone.r22 内容: 111 1.5 222
          58. 资源库中的最新版本
          59. 解决冲突
          60. 第一种选择:提交带有冲突信息的 phone.txt
          61. 适用于李四想让张三解决冲突的情况
          62. 缺点:岂不是会造成phone.txt无法编译?
          63. 操作方法
          64. svn resolve --accept working phone.txt
          65. 此操作将删除 phone.mine、phone.r21 和 phone.r22 这三个文件
          66. svn commit -m 我们冲突了,咋办?
          67. 之后版本号变为了23
          68. 之后由张三获取最新版本的phone.txt,然后决定保留“aaa”还是“1.5”,然后再次提交修改
          69. 第二种选择:丢弃自己的修改
          70. 操作方法
          71. svn resolve --accept theirs-full phone.txt
          72. 此操作将删除 phone.mine、phone.r21 和 phone.r22 这三个文件,并将phone.txt内容变成资源库的最新版本
          73. 另一个更简单的命令是:svn revert phone.txt
          74. 第三种选择:丢弃别人的更改
          75. 操作方法
          76. svn resolve --accept mine-full phone.txt
          77. 此操作将删除 phone.mine、phone.r21 和 phone.r22 这三个文件,并将phone.txt内容变成与phone.mine一样
          78. 缺点:张三并不知道自己的变更被覆盖了。张三以后会很迷惑,知道自己的修改被偷偷丢弃了会很生气,后果很严重。
          79. 【推荐】第四种选择:手工修改phone.txt
          80. 恰好两个人修改了同一个函数的情况比较少见,一般都是恰好添加或删除的文本位置有重叠。所以大部分情况下可以发现大家只是恰好都在第2行添加了一个函数,这时只要把自己的修改追加到别人的修改的后面就行了
          81. 使用TortoiseSVN(资源管理器插件)的“Edit Conflict”的可视化功能,可以更方便得完成这一工作
          82. svn resolve --accept working phone.txt
          83. 此操作将删除 phone.mine、phone.r21 和 phone.r22 这三个文件
          84. svn commit
          85. 【历史版本】
          86. 查看历史版本
          87. 查看历史Log Msg:svn log
          88. 查看版本为21的 phone.txt:svn cat -r 21 phone.txt
          89. 【将版本为13的 phone.txt临时保存为nn.txt】
          90. svn cat file:///F:/SVN/CollabNetSVN/svn_repository/1-2-3/phone.txt@13 > nn.txt
          91. 比较21和22版的不同: svn diff -r 21:22 phone.txt
          92. 回到历史版本
          93. svn update -r 10
          94. svn update -r {2009-4-16}
          95. svn update -r {"2009-4-16 16:10:00"}
          96. svn checkout 也可使用 -r 参数
          97. 【导出(不带.svn目录)】
          98. svn export file:///F:/SVN/CollabNetSVN/svn_repository/1-2-3 e:/qqq
          99. 【清理】
          100. 当执行 svn update 操作时,svn的操作方法是先把要做的更改写进一个Log文件里,然后锁定要更改的文件,然后根据Log文件做更改。如果做这些操作时进程意外挂掉,或突然断电,会有一些文件一直处于锁定状态(使用svn status 时这些文件会被标记为“L"),这时应该使用 svn cleanup 命令
          101. 【找回删除的文件】
          102. 使用svn log -v 查看文件或目录是在哪个版本删除并提交的
          103. svn copy file:///F:/SVN/CollabNetSVN/svn_repository/1-2-3/NBA@7 NBA
          104. ”@“后面是版本号,应该是删除并提交的版本号-1
          105. 注意路径和文件名区分大小写
          106. svn commit
        3. 备份
          1. 完全备份
          2. 【备份】svnadmin dump F:\SVN\CollabNetSVN\svn_repository\1-2-3 > F:\SVN\bak\123090421.dump
          3. 【恢复】
          4. 先在F:\SVN\repo\1-2-3创建一个资源库
          5. svnadmin load F:\SVN\repo\1-2-3 < F:\SVN\bak\123090421.dump
          6. 使用任务计划自动备份
          7. 创建一个叫做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
          8. 创建一个Windows的任务计划,执行这个svndump.bat
  4. SVN服务
    1. windows服务:svnserve
      1. CollabNetSVN 和 sliksvn(完全安装)都提供了叫做svnserve.exe的Windows服务
      2. 临时运行一下
        1. svnserve -d -r F:\SVN\CollabNetSVN\svn_repository
      3. 安装为Windows服务
        1. 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
      4. 删除此Windows服务(如果需要重装)
        1. sc delete svnserve
      5. 设置权限
        1. 默认是只读的
        2. 配置文件
          1. F:\SVN\CollabNetSVN\svn_repository\1-2-3\conf\svnserve.conf [general] anon-access = none auth-access = write password-db = passwd authz-db = authz
          2. 注意:配置文件每一行(例如anon-access=none)前面都不能有空格!否则会报“Option expected”的错误
          3. F:\SVN\CollabNetSVN\svn_repository\1-2-3\conf\passwd [users] jcl = jjjjjj yy = 123 wdl = 123
          4. F:\SVN\CollabNetSVN\svn_repository\1-2-3\conf\authz [1-2-3:/] jcl = rw wdl = r yy = rw [1-2-3:/NBA] yy=
        3. 重启服务,之后再访问时就会提示需要用户名和密码
          1. TortoiseSVN 清除缓存的密码的方法:Windows资源管理器右键菜单|TortoiseSVN|Settings|Saved Data|点击“Authentication Data”右侧的“Clear”按钮
      6. 访问路径
        1. svn://172.16.75.77/1-2-3
    2. Apache 服务
  5. 使用规范
    1. 管理员
      1. 排除Bin文件夹和.suo文件
        1. 设置客户端ignore属性
          1. TortoiseSVN
          2. bin上右击,TortoiseSVN|Delete and Add to ignore list
          3. 相当于先在为bin的父目录添加一个svn:ignore属性,属性的值是“bin”,再把bin从资源库中删除
          4. 命令行
          5. svn propset svn:ignore bin cncalweb
          6. svn delete bin
          7. svn commit
          8. 运行程序重新生成bin目录,或者把在第二步之前备份的bin目录Copy回来
      2. 可以考虑将特定类型的文件设为“锁定-修改-解锁”的模式
        1. 例如像.aspx这种文件,如果修改就可能会是修改了第2、10、15、22、36行,也就是说修改的点会比较分散,如果发生冲突不太好解决,可以考虑把这种文件设为“锁定-修改-解锁”模式
        2. 方法(TortoiseSVN):选中所有的.aspx文件,添加一个名为“svn:needs-lock”,值为“*”的属性。缺点是每次添加新的页面文件都要手动设置,比较麻烦,也容易忘
      3. 文件夹布局
        1. 资源库
          1. 项目名称
          2. trunk
          3. code
          4. doc
          5. branches
          6. tags
    2. 普通用户
      1. 每天开始工作前必须先获取最新版本
      2. 完成工作并编译无错后,要尽快签入
        1. 在窗体下部的“Change made”表格中列出了将要签入的文件列表,查看都有哪些文件被自己修改过,确保不会签入意外修改的文件。
        2. 用一句话概括本次提交的修改,如果是解决某个问题,要填写问题号
        3. 不允许签入未通过编译的代码
      3. 新增、重命名、删除文件要使用TortoiseSVN 的“TortoiseSVN|Add…”、“TortoiseSVN|Rename…”、“TortoiseSVN|Delete”操作。在需要重命名或删除文件时,要先确认项目组全体成员都已经签入了对这个文件的修改之后再进行操作。
      4. 发生冲突时,要先解决冲突、编译无错后再签入
        1. 解决冲突的3个选择
          1. 1. 两人在同一处插入了代码的情况。解决方法:把自己的代码置于他人的代码之后。
          2. 2. 两人修改了同一处代码。解决方法:先查看Log找到与自己冲突的人,然后共同确定如何解决冲突。
          3. 3. 自己意外修改了代码。解决方法:撤销自己的修改。