Archive:Getting Started/Sources/Subversion (zh CN)

From KDE TechBase
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.


在 KDE 中使用 Subversion
Tutorial Series   开始入门
Previous   None
What's Next   n/a
Further Reading   n/a

摘要

本文是针对 KDE 的使用 Subversion 从 KDE 仓库获取文件和软件的快速指南,关于 Subversion 更详细的内容请阅读这本书"用Subversion进行版本控制".

现在开始

要使用 KDE Subversion 仓库,要做两件事:

  1. 一个 Subversion 客户端程序
  2. 我们仓库的一个帐户

注意: 对于匿名(anonymous)只读用户使用 “svn“ 协议的,在以下描述的服务器 ”anonsvn.kde.org“ 前没有 ”yourname@“ 字样。

安装 subversion:在这里我们不打算教你怎么安装客户端。请参考你的系统安装指南来指导你安装 Subversion。你安装的Subversion 至少是 1.1 版本。如果你是从源代码编译的并且需要通过https(svn+ssh)来连接 KDE 仓库,你需要 SSL 和 ZLIB 支持,因此你需要在编译时加上 --with-ssl --with-zlib 选项。

当然,你也可以安装一种图形客户端。本指南假设读者都是只使用 svn 程序,并参照了使用 cvs 程序完成的工作。

获取帐户:如果先前你已经有了一个 CVS 帐户,你可以直接用这个帐户来连接 subversion 仓库,如果你还没有,请参考教程来申请。

Note
如果你丢失了你的 CVS 密码,有个简单的办法可以找回。请参见这里: cvspwd.ccvs-unscramble (Perl).



KDE 仓库的结构

svn.kde.org/home/kde

以上就是 KDE subversion 仓库的地址。这个仓库支持 HTTPS 或者 SVN+SSH 协议,这意味你的密码是安全的,不会被第三方窃听。

仓库的 SSL md5 校验值:

F6BF EDE2 D016 D1B2   4F18 742E 2C8F B7EF

仓库的 SSL sha1 校验值是:

e1:e6:41:96:3c:eb:ae:78:e2:73:0d:a2:32:2f:6b:21:13:bf:3d:0f

如果你使用 svn+ssh,下面是服务器 RSA 密钥的值:

86:f3:66:06:20:74:81:d0:1b:b4:2f:25:03:f7:8e:fb

仓库的主要目录如下:

  1. /branches
  2. /tags
  3. /trunk

你可以在http://websvn.kde.org/ 浏览仓库的结构

顶级目录 /trunk

顶级目录 /trunk 是 KDE 开发的主目录. 这里存放的是 KDE 的下一代版本和相关程序。里面还有包含 KDE 站点网页和相关内容的 www 模块。

/trunk 包含从下子目录:

  • KDE/
    KDE 的自身目录,包含了下一版本的所有内容。包含的各个模块如下所示:
    • kdelibs - KDE 基本库,所有 KDE 程序都依赖的
    • kdebase - KDE 基本程序,比如: Kcontrol(KDE 控制中心),Kicker(面板)和 Konqueror(网页浏览器)
    • kdeaccessibility - 易用性辅助程序
    • kdeadmin - KDE 系统管理应用程序
    • kdeartwork - 图像,主题,声音和其他面子文件
    • kdebindings - 与 C++ 外其他语言的绑定
    • kdeedu - KDE 教育应用程序
    • kdegames - KDE 游戏程序
    • kdegraphics - KDE 图形应用程序
    • kdemultimedia - KDE 多媒体应用程序
    • kdenetwork - KDE 网络应用程序
    • kdepim - KDE 个人信息管理程序
    • kdepimlibs - KDE-PIM 应用程序所依赖的库
    • kdesdk - KDE 软件开发包
    • kdetoys - KDE 小应用程序
    • kdeutils - KDE 一般应用
    • kdevelop - KDevelop 程序
    • kdevplatform - KDevelop 所依赖的开发平台
    • kdewebdev - KDE 网络开发应用程序
  • kde-common
   :Common admin/ 目录
  • bugs/
   :Bugzilla 文件
  • developer.kde.org/
   :developer.kde.org 的内容
  • extragear/
   :KDE 开发套件外的 KDE 程序
  • kdereview/
   :KDE 应用程序达到发布质量所建立的临时目录。 在这里一旦所有主要问题都解决了,程序就移到 /trunk/KDE/ 或者 /trunk/extragear/ 目录
  • kdesupport/
   :支持 KDE 的程序和库
  • koffice/
     KDE Office套件,包括的程序有:
    • karbon
    • kchart
    • kexi
    • kformula
    • kivio
    • koshell
    • kplato
    • kpresenter
    • krita
    • kspread
    • kugar
    • kword
  • konstruct/
   :Konstruct, KDE 的构建程序
  • l10n-kde3/
   :KDE 3 "unstable"模块(extragear, playground)的翻译
  • l10n-kde4/
   :KDE 4 的翻译
  • playground/
   :KDE 桌面背景:程序正在开发,还没有达到发布的质量。
  • qt-copy/
   :Trolltech's Qt 库的一个拷贝, 是 KDE 的基础。
  • tests/
   :khtml, KOffice 和 ksvg 的testcases
  • valgrind/
   :Valgrind 程序托管在 KDE 仓库。但是它不是 KDE 的一部分。注意, Valgrind 新版本的开发位于其自己的仓库中。KDE 中的 Valgrind 模块只有 Valgrind 2.4 版。
  • www/
   :KDE 站点(和相关站点)的网页。这个目录的写权限是受限的。

顶级目录 /tags

这个目录包含了 KDE 仓库所维护和开发的官方版本。每一个独立的应用程序都有一个子目录。里面有他们自己的版本号。 例如,KDE 3.4.0 的所有代码都在/tags/KDE/3.4.0/目录下。

顶级目录 /branches

本目录包含了一个主发行版之后的分支版本号 大部分添加了新特性(例如新的用户可见的字符串)的 KDE 程序只会进入位于/trunk/目录的新版本,而bug修复版本是针对所有版本的,特别是发行了的版本。

为了做到这样,在一个主发行版后会立即产生一个分支,表明在文件在当时的状态。bug修复后会检查这些文件。这些分支都位于 /branches/目录下面。

例如,KDE 3.4.x 分支就位于 /branches/KDE/3.4/ 目录下。

/branches 下面的子目录是各个应用程序的目录,像 akregator/, amarok/, arts/, k3b/, 等等。你也会发现包含了先前的 KDE 官方发行版 KDE/ 子目录。

/branches目录下你还会发现一个特别的目录 work/,这个目录包含所谓的“工作分支”,也就是说包含了正在开发的各种特性,特别是实验性的。多个应用程序的工作目录也会同步到 /branches/work/ 目录下,但是只是单个程序的话可能就只位于其程序的子目录下。这取决于程序的开发者。

检查与更新

检查

为了检查 Subversion 仓库,你要使用 checkout 子命令

警告: 你要下载完整的kde-i18n!如果你要检查 trunk/KDE/ 或者 branches/KDE/foo/ 目录你会完整下载 kde-i18n ! 假设你只想检查 KDE 仓库的 KDevelop。你要这样做: CVS 命令:

cvs -d :pserver:[email protected]:/home/kde login
cvs -d :pserver:[email protected]:/home/kde checkout kdevelop

Subversion 命令: CVS 用户如果用 ssh 连接,下面的协议应该用 svn+ssh CVS 用户如果用密码连接,下面的协议应该用 https


svn checkout <协议>://<username>@svn.kde.org/home/kde/trunk/KDE/kdevelop

更新

要更新,你就要使用 update 子命令。 这和 CVS 是一样的:你在检查的拷贝中做了修改(因为这些对整个过程是新的,所以你检查的拷贝要位于你的 Home 目录),然后发出 svn update 命令(或者,更短svn up

了解文件的状态

为了了解你修改了哪些本地文件,在 CVS 中,大部分人使用 cvs up 然后找到带有 M 的文件,但是,这在 svn 中不起作用,所以你必须使用 svn 方法来查看文件的状态。

递交回仓库

就像在 CVS 中一样,递交回仓库用 commitcheckin (简写为 ci )子命令来完成

CVS 命令:

cvs commit
  1. 或者
cvs ci
  1. 或者
cvs ci filename.cpp

Subversion 命令:

svn commit
  1. 或者
svn ci
  1. 或者
svn ci filename.cpp

这样 svn 命令就会启动 $SVN_EDITOR 里设定的编辑器来编写你的提交信息。如果你喜欢,你可以使用带 -m 选项的 svn 命令来添加你的所有信息:

svn ci -m "Updating protocol to conform to HTTP/1.1"

忽略文件

Subversion 在每个目录下都存储被忽略的文件。使用 svn propedit svn:ignore 可以编辑你当前所在目录下要被忽略的文件,这会启动你的编辑器,把你要忽略的文件名写进文件中,每个文件占一行。当录入完后,做一次提交,这样你要忽略的文件列表就上传到服务器上了。

在 CVS 中,通过全局列表可以忽略很多文件(目前在 SVN 中还不支持)。但是,你可等到 svn 1.3 或者把忽略列表添加到你的 subversion的本地配置文件 ~/.subversion/config 的[miscellany]组中(所有的都在同一行:

global-ignores = *.o *.lo *.la .*.rej *.rej .*~ *~ .#* #*# .DS_Store *.moc
*.moc.cc *.moc.cpp config.log config.status config.cache *.gmo .deps .libs
SunWS_cache *.lo *.la *.rpo *.la.closure *_la_closure.cpp *_la_closure.cc
*_la_closure.cxx *.all_cc.cc *.all_cpp.cpp *.all_C.C *.all_cxx.cxx
*_meta_unload.cc *_meta_unload.h *_meta_unload.cpp *_meta_unload.C
*_meta_unload.cxx index.cache.bz2 .memdump Makefile.rules.in Makefile.calls.in
Makefile.rules Makefile.calls autom4te.cache *.kidl

在多个版本和分支中工作

与CVS不同, Subversion 不会为每个修改过的文件自动产生版本号。而是把整个仓库做为一个整体进行版本编号。这样给定的版本号在给定的时侯就表明了仓库的状态。换句话说,一个版本号就是一个时间签(事实上,Subversion 服务器就是基于此使在仓库中的是期搜索更快。

例如,当你检查 KDE 仓库时,Subversion 会显示如下信息:

Updated to revision 403821.(更新版本 403821.)

这个意思就是获得的最新版本是在操作数为 403821 的时候。 如果你做了修改并提交了,Subversion 就会更新服务器端的版本并通知你。和Like CVS 一样, 只有提交了的文件才会更新,你需要运行cvs up 来更新其他文件。

如果你想找一个文件的特别的版本号,你可以用 -r 开关。除了版本号本身, -r 更接受其他许多选项:

  • 版本号:例如, 用 -r 403819 来找这个版本的文件
  • BASE: 你更新到的版本
  • COMMITTED: 在 BASE 前,文件最后修改的版本
  • PREV: 在 COMMITTED 前的提交到服务器的版本
  • HEAD: 服务器中最新可获取的版本
  • { date }: 在两个大括号中间,你可以写上特定的时期来搜索最相近的版本

下面演示了关键词的变化历程:

  1. 你可以运行 svn up 来更新到最新可获取的版本。假设 Subversion 告诉你,你可以更新到 403821 版本,这意味着 HEAD 和 BASE 都是 403821。
  2. 你修改了README 文件并提交了。假设 Subversion 告诉你 提交的版本号是 403822。那么 HEAD, BASE 和 COMMITTED 就都是 403822 了。
  3. 你又修改了文件并提交了。现在 PREV 就是 403822,但是,HEAD, BASE 和 COMMITTED 就都被更新到新的值 (假设是 403823)。
  4. 现在又其他人修改了仓库,然后你又更新你的工作拷贝。如果,Subversion 告诉你它现在是 403824,这就是说现在 HEAD 和 BASE 被改成了 403824 (但是,PREV 和 COMMITTED 保持不变)
  5. 如果现在又有人修改了 README 文件, HEAD 就会被移除。其他关键词对你都没有变,除非你更新。这一你,我们的 HEAD = 403825 (最后可获取的版本), BASE = 403824 (你先前更新到的版本), COMMITTED = 403823 (你最后一次更新时文件的最后修改的版本) and PREV = 403822 (在 COMMITTED 前修改的版本)

这些关键词对恢复日志和仓库中提交的差异是很有帮助的。

如果你想查看你目前的工作拷贝和 BASE 之间的差异,你可以运行:

svn diff

这个操作速度很快,因为 Subversion 也会存有一份本地的 BASE 拷贝。它不需要连接网络来完成操作。

如果你想查看你目前的工作拷贝和服务器上最新可获取版本之间的差异,你可以运行:

svn diff -r HEAD

如果你想查看你最后更新到当前为止,仓库中发生的变化,你可以用:

svn diff -r BASE:HEAD

如果你想查看 BASE 前文件的最新变化,你可以用:

svn diff -r PREV:BASE
  1. 或者
svn diff -r PREV:COMMITTED

使用 svn log 命令同样有用。

连向其他地方的子目录

有时候为了方便,你可能会用一个子目录来连接到外部的不是你所开发的内容。那么它会随会源的变化而自动更新。Subversion 可以帮你,你需要编辑目录中要添加的子目录的 svn:external 属性。首先,在当前目录下用 svn propedit svn:externals 来编辑 svn:externals 属性。然后输入一行 libkhalkhi 字样 svn://anonsvn.kde.org/home/kde/trunk/playground/pim/khalkhi ,这样就会把 /trunk/playground/pim/khalkhi 更新到子目录 libkhalkhi下。

Warning
小心,不要把外部子目录的本地拷贝也做为提交内容,它只是一份只读拷贝。


你要使用 svn://anonsvn.kde.org 而不是其他协议,因为 anonsvn.kde.org 对任何人都是可视的。使用 https:svn+ssh: 协议的话,就只能对那些使用相同协议的人可视。在 anonsvn.kde.org 中仍有一些小缺点:它不能时时与svn.kde.org 保持同步,所以,在原来的分支更新要过一段时间才能到达 anonsvn.kde.org。而且,有些严格点的防火墙会阻止 svn: 协议。

举个明显的例子,就是在 KDE 3 下在 admin 的子目录,包含了用来构建 KDE 3 的应用程序。它连接到所有模块的顶级目录, 是在 /branches/KDE/3.5/kde-common 目录进行维护的。对于 admin 目录,KDE subversion 服务器配置其为对所有人都是只读的,这样如果你用 admin https://svn.kde.org/home/kde/branches/KDE/3.5/kde-common/admin 来查看,会发现是没有变化的。

在 KDE wiki 上还有更多内容

参看此页 KDE 维基 了解更多关于在 KDE 中使用 subversion 的内容。