Subversion如何使用磁盘空间

Filed Under (Subversion Server) by rocksun on 30-03-2007

我希望分享一些openCollabNet技术时事通讯的信息,如果你没有得到,你可以注册openCollabNet,只需要几分钟。

为了保持版本库尽可能的小,Subversion增量,叫做”增量存储”。增量是基于一些其他数据的区别数据,如果两个文件非常类似,只会保存增量结果,因为只保留了修改,而不是整个文件。

这个工作要取决于你使用的文件系统后端,在BDB(Berkeley数据库)时,可以在文件历史的每个主线前端看到文件全文,当发生修改时,新修订版本会以全文方式存放,然后以前的版本会以新版本的增量方式存放,FSFS使用相反的方向保存增量,所以旧数据不必重写,当文件修改时,新版本作为老数据的增量添加。

大多数源代码会频繁更改,如果使用每个增量来重建文件时,Subversion的性能会有所下降,Subversion使用”略过增量(skip-deltas)”来改进性能,略过的增量不是根据下一个或上一个版本,而是代表文件全文增量链所靠近的版本。这样可以使用较少的增量来重建文件,而不必需要所有单独的修改的增量。

对于使用Subversion 1.4或以后创建的版本库,空间节省明显,因为增量数据使用压缩算法保存。

原始链接

Guido Haarmans is Director Developer Relations at CollabNet, he works on openCollabNet and CollabNet Subversion product marketing.


Technorati : , , , , , , , , , , ,

Subversion结合Apache使用LDAP认证

Filed Under (Administration) by rocksun on 28-03-2007

越来越多的公司使用目录服务来管理用户的凭证和信息,例如Active DirectoryeDirectoryOpenLDAP等目录服务,这与Subversion有关吗?很好,我曾经参与过企业级开发,很多客户希望利用他们现有的目录服务作为Subversion认证,这篇blog将会解释在 Apache中使用mod_auth_ldap结合目录服务,让你可以使用现有的数据进行认证。

此时,只能使用Apache作为网络层时才能利用目录服务认证,这允许你利用mod_auth_ldap使用所有的Apache认证选项来对Subversion进行认证,Apache可以为Subversion使用目录服务认证。

在我们开始修改Apache配置文件之前,来看一下将Subversion导出到Apache的最简单Location指示:

<Location /repos>
# Enable Subversion
DAV svn

# Directory containing all repository for this path
SVNParentPath /absolute/path/to/directory/containing/your/repositories
</Location>

现在,让我们在Location指示的认证选项部分添加mod_auth_ldap支持:

<Location /repos>
# 开启Subversion
DAV svn

# 包含所有版本库的路径
SVNParentPath /absolute/path/to/directory/containing/your/repositories

# LDAP认证和授权
AuthLDAPAuthoritative on

# 使用基本的密码认证
AuthType Basic

# 保护区域或"域"的名称
AuthName "Your Subversion Repository"

# Active Directory requires an authenticating DN to access records
# This is the DN used to bind to the directory service
# This is an Active Directory user account
AuthLDAPBindDN "CN=someuser,CN=Users,DC=your,DC=domain"

# This is the password for the AuthLDAPBindDN user in Active Directory
AuthLDAPBindPassword somepassword

# The LDAP query URL
# Format: scheme://host:port/basedn?attribute?scope?filter
# The URL below will search for all objects recursively below the basedn
# and validate against the sAMAccountName attribute
AuthLDAPURL "ldap://your.domain:389/DC=your,DC=domain?sAMAccountName?sub?(objectClass=*)"

# Require authentication for this Location
Require valid-user
</Location>

可以使用其中的注释来理解Apache配置指示中使用mod_auth_ldap,通过上面的例子(需要根据情况修改你的环境)你可以通过活动目录服务来认证你的Subversion用户,如果在AuthLDAPURL中又很小的修改,上面依然可以工作,你可以咨询第一段中引用mod_auth_ldap的文档,尽管本文很简单,但是希望能够给你带来价值。

原始链接

Jeremy is an open source advocate and is currently one of the lead Subversion consultants at CollabNet. In his spare time, he contributes to many open source projects, plays many video games and still continues to be amazed at the personal growth of his two year old son.


Technorati : , , , , , , , , , , ,

多Subversion版本库?

Filed Under (General) by rocksun on 23-03-2007

Svnsync_4 在星期三,CM Crossroads和CollabNet主持了一个webinar:企业级Subversion,由来自CollabNet的C. Michael Pilato和Bob Jenkins与Reuters的SCM管理员Terrence Cordes展示。Terry带来了许多跨全球团队部署Subversion的理解,我很快会发布这次webinar录像的链接,因为展示者只得到很少的问题,我们会在未来的几周里回答这些问题,下面是第一个,被许多人问过:

你会因为WAN的性能而会推荐分布式团队使用多版本库吗?

Subversion本身不支持同时用来读和写的版本库同步,Subversion使用一个中央服务器,当设计时,我们一直留意WAN的低带宽需求

Subversion的工作拷贝模型意味着开发者可以在没有连接到服务器时工作,你只需要偶尔连接到服务器,例如当提交或更新工作拷贝时,当数据来回传递时,只包含变化的内容。

实际上Mike Pilato在webinar上略微谈到,如果你对大文件作出了很小的修改,指挥在网络上传递修改,而不是整个文件。根据最小的带宽需求,Subversion只会在开发者检出版本库时发送整个文件。

结论是Subversion的WAN性能不是问题,假定你的网络是可靠的。

Subversion部分支持多版本库,在1.4引入了svnsync,这个工具可以为你的版本库提供任意数量的只读复制品,有许多相关的使用模型,比较常见的是备份。

但是也有许多其他用法,例如,在EclipseCon上我看到了一些菲律宾人询问如何在网络停滞时使用多库(我们知道最近亚洲的网络损耗),他们的开发团队在洛杉矶,但是测试和构建在菲律宾,这个公司可以在美国创建读写版本库,然后使用svnsync制作远程拷贝用来构建和测试,当国际网络带宽下降时,他们可以使用本地只读拷贝构建。

你可以通过”svnsync help”获得许多帮助,或者查看在线版本的《使用Subversion进行版本控制》,作者发布1.4版本的书,并有了svnsync一章(我不能给你精确的url,因为日构建的url一直在变)。

如果你希望使用Subversion和真的需要多个读写版本库,解决方案是:svk(它的主要作者是Chia-liang Kao),svk是一个非集中式版本控制系统,建立在Subversion基础上,它支持版本库镜像和离线操作,一些用户会在使用分布式版本库方案时选择试用这个系统来确认是否真的需要,它在需要开发者经常离线操作时有一些优势,例如:就像Subversion,他们可以离线操作并提交到本地版本库,然而,它会带来许多管理代价,会需要更高的带宽和更多的服务器基础,Subversion的中央模型非常易于部署和维护,如果你不需要分布式模型,将会很少的所有权代价。

原始链接

Guido Haarmans is Director Developer Relations at CollabNet, he works on openCollabNet and CollabNet Subversion product marketing.


Technorati : , , , , , , , , , , , ,

认证和匿名认证的苦恼

Filed Under (Subversion Server) by rocksun on 22-03-2007

最近第一次使用Subversion路径为基础的授权模型,结果是并没有比我计划的更琐碎,因为我使用允许匿名用户访问的版本库。事情开始很正常 - 我从《使用Subversion进行版本控制》拷贝和粘贴了httpd.cong文件和授权(authz)文件的内容,并根据我的需要修改,我以为我做出了完美的配置,我错了。

就像我,我希望配置版本库允许匿名的访问大部分内容,认证读其他部分。你已经有了一个Apache的htpasswd文件,包含写入者的用户名和密码,你配置Apache使用htpasswd文件,并且使用authz文件,然后你在authz文件中添加一些内容:

[groups]
writers = someuser1, someuser2, …

[repository:/]
* = r
@writers = rw

[repository:/trunk/private-area]
* =
@writers = rw

有一个组包含写入者的用户名,有一个规则将匿名访问赋给全世界,只对writer赋予写权限,然后通过删除读权限来禁止非授权用户在版本库私有区域的读访问,看起来很不错。

然后开始测试。

根据从版本库的/trunk目录的检出,匿名用户得到了期待的目录树,没有包含/trunk/private-area目录。

但是对于认证用户writers会发生什么?这是在说谎!没有人证用户,因为匿名用户检出了目录树,Apache不会打扰你获得认证凭证,而你无法在Apache没有询问时强制Subversion传输认证凭证。

所以,工作区是什么?

首先,你可以首先关闭所有的匿名访问,然后强制所有的非writer来分享一个如”anonymous”的用户名和一个公共密码。在你的authz规则,用户”anonymous”只会读访问,对象是版本库的公共部分,这样工作的很好,但是对于非writer有一点不舒服,他们现在需要提供密码,尽管不是秘密,但仍然有人不知道。

第二,你可以保留现状,然后强制用户单独检出版本库的私有区域,连接私有区域为一个工作拷贝不会有什么问题,但是还好。

第三,你可以在自己的版本库保持私有事情,对于writers,这与第二种情况非常类似,但是你的writer不能包含历史的保持私有事情。

最后,你可以在httpd.conf配置第二个<Location>,会指向不同的URL(例如,使用”-no-anon”),在这个块里,禁止匿名访问,然后再authz文件添加冗余的条目:

[repository-no-anon:/]
* =
@writers = rw

现在匿名非writers可以无需提示检出最初的版本库URL,也不会看到私有区,非匿名作者可以从另一个版本库URL检出,并能看到私有区域。(感谢Max Bowsher提供的混合工作区想法。)

原始链接

C. Michael (Mike) Pilato has been on the Subversion project as a committer since 2000. Mike is one of the co-authors of “Version Control with Subversion” and he is on the board of the non-profit Subversion Corporation.

计算标签的区别

Filed Under (Subversion Client) by rocksun on 16-03-2007

Subversion邮件列表中一个常见的问题是”我如何查看两个标签之间的区别?”,当然也有一些问题的变种,例如trunk和分支有什么区别等等。询问这个问题的人几乎都会意识到他们可以运行svn diff命令得到区别,但是通常他们只是希望知道文件名列表的区别,而不是行级的区别,在Subversion 1.4以前,这个问题的结果通常是解析diff的输出来萃取文件名。

在Subversion 1.4,diff命令添加了一个新的选项–summarize,当使用这个选项时,diff命令输出文件级别的区别,例如,为了查看Subversion 1.3.1和1.3.2标签的区别:

svn diff --summarize http://svn.collab.net/repos/svn/tags/1.3.1 http://svn.collab.net/repos/svn/tags/1.3.2
M http://svn.collab.net/repos/svn/tags/1.3.1/STATUS
M http://svn.collab.net/repos/svn/tags/1.3.1/build.conf
M http://svn.collab.net/repos/svn/tags/1.3.1/configure.in
M http://svn.collab.net/repos/svn/tags/1.3.1/build/ac-macros/aprutil.m4
M http://svn.collab.net/repos/svn/tags/1.3.1/build/ac-macros/apr.m4
M http://svn.collab.net/repos/svn/tags/1.3.1/build/ac-macros/swig.m4
M http://svn.collab.net/repos/svn/tags/1.3.1/build/get-py-info.py
M http://svn.collab.net/repos/svn/tags/1.3.1/build/generator/swig/external_runtime.py
M http://svn.collab.net/repos/svn/tags/1.3.1/subversion/include/svn_version.h
M http://svn.collab.net/repos/svn/tags/1.3.1/subversion/libsvn_wc/status.c
M http://svn.collab.net/repos/svn/tags/1.3.1/subversion/libsvn_wc/lock.c
M http://svn.collab.net/repos/svn/tags/1.3.1/subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.c
M http://svn.collab.net/repos/svn/tags/1.3.1/subversion/bindings/swig/INSTALL
M http://svn.collab.net/repos/svn/tags/1.3.1/subversion/bindings/swig/NOTES
M http://svn.collab.net/repos/svn/tags/1.3.1/subversion/mod_dav_svn/version.c
M http://svn.collab.net/repos/svn/tags/1.3.1/subversion/mod_dav_svn/repos.c
M http://svn.collab.net/repos/svn/tags/1.3.1/subversion/tests/clients/cmdline/stat_tests.py
A http://svn.collab.net/repos/svn/tags/1.3.1/subversion/tests/clients/cmdline/authz_tests.py
M http://svn.collab.net/repos/svn/tags/1.3.1/subversion/tests/clients/cmdline/svntest/actions.py
M http://svn.collab.net/repos/svn/tags/1.3.1/subversion/tests/clients/cmdline/svntest/main.py
M http://svn.collab.net/repos/svn/tags/1.3.1/subversion/tests/libsvn_repos/repos-test.c
M http://svn.collab.net/repos/svn/tags/1.3.1/subversion/libsvn_repos/commit.c
M http://svn.collab.net/repos/svn/tags/1.3.1/subversion/svnserve/serve.c
M http://svn.collab.net/repos/svn/tags/1.3.1/subversion/po/ja.po
M http://svn.collab.net/repos/svn/tags/1.3.1/subversion/po/zh_TW.po
M http://svn.collab.net/repos/svn/tags/1.3.1/contrib/client-side/svn_load_dirs.pl.in
M http://svn.collab.net/repos/svn/tags/1.3.1/tools/hook-scripts/mailer/mailer.py
A http://svn.collab.net/repos/svn/tags/1.3.1/tools/server-side/svnauthz-validate.c
A http://svn.collab.net/repos/svn/tags/1.3.1/tools/server-side
M http://svn.collab.net/repos/svn/tags/1.3.1/CHANGES
M http://svn.collab.net/repos/svn/tags/1.3.1/packages/rpm/rhel-3/apr.patch
M http://svn.collab.net/repos/svn/tags/1.3.1/packages/rpm/rhel-4/apr.patch
M http://svn.collab.net/repos/svn/tags/1.3.1

通过diff命令的–summarize选项,输出显示了文件级别的区别,输出与许多其他Subversion命令类似,第一列的值说明文件是添加的,修改的,删除的,第二列则是属性的相关动作。这样可以在脚本中容易的解析输出,–summarize选项是diff命令的伟大改进,很好的解决了这个用例。

原始链接

Mark Phippard is Director, Subversion Engineering at CollabNet. He works on the CollabNet Subversion team and is a project owner for the Subclipse project as well as a partial committer for Subversion.