Subversion:不仅仅用于代码
您是否曾经需要从文件中获取一些信息,却只记得您在一周前修改过该文件并删除了您感兴趣的信息?或者,您是否曾经花费数小时在数十个命名不一致的相同文件副本中筛选,试图找到某个特定版本?如果您像我一样,那么对这两个问题的回答可能都是响亮的“是”。当然,如果您是一名程序员,您可能已经通过使用像 CVS 或 Subversion 这样的版本控制系统解决了开发活动中的这个问题。但是其他一切呢?妈妈的樱桃馅饼食谱可能不如 rpc_init.c 那样频繁更改,但是如果您决定创建一个低卡路里版本,您肯定不希望丢失原始版本。事实证明,版本控制不仅仅适用于源文件。Subversion 的许多功能使其非常适合对各种文件进行版本控制。
使用 Subversion,您可以保留对文件所做更改的历史记录。这样,您可以轻松地回溯并查看给定文件在特定时间点包含的确切内容。您还可以节省空间,因为它存储从一个版本到下一个版本的差异。这样,当您更改版本控制的文件时,它只需要足够的额外空间来存储更改,而不是文件的完整第二个副本。此外,与 CVS 不同,Subversion 上的增量存储也适用于二进制文件以及文本文件。
Subversion 还使您可以轻松地从多台计算机访问您的文件。您无需担心笔记本电脑上的预算报告副本是否反映了您昨晚在家用台式机系统上所做的更改,您只需在笔记本电脑上运行更新,Subversion 就会自动将您的文件更新为存储库中的最新版本。此外,由于所有版本都存储在单个存储库中,因此您只需要备份一个位置即可确保所有数据的安全。
所以您对它产生了兴趣。您认同版本控制文件的优点,并且想尝试一下。首先要回答的问题是,您要将哪些文件置于版本控制之下。一种明显的可能性是对您的整个硬盘驱动器进行版本控制。但在实践中,这不是一个非常实际的方法。当您在本地存储存储库内容的一部分(称为工作副本)时,Subversion 会存储每个文件的第二个副本,以便它可以比较您在本地所做的更改与存储库中最新版本之间的差异。因此,如果您对整个硬盘驱动器进行版本控制,您将需要两倍的硬盘驱动器空间。
对于文件系统中大部分静态部分(例如 /usr 或 /opt)保持完整的修订历史记录也没有什么理由。另一方面,包含大量自定义文件/修改的目录,例如 /etc 或 /home,是版本控制的主要候选对象,因为跟踪这些更改的优势更有可能超过额外存储要求的劣势。此外,使用 Subversion,您可以选择从存储库层次结构中的子树创建工作副本。这样,您无需在本地存储任何不经常访问的数据的副本,这通常会导致硬盘驱动器需求的净减少,即使您在本地存储的文件占用了两倍的空间。
现在,让我们深入了解并在您的机器上运行 Subversion。安装通常非常容易。您当然可以下载 Subversion 源代码并进行编译,但在大多数情况下,安装您选择的 Linux 发行版的预编译二进制软件包会容易得多。幸运的是,Subversion 已经成熟到几乎每个主要发行版都可以使用这种软件包的程度。事实上,我不知道有什么主要发行版没有提供它。
安装 Subversion 后,就该创建存储库了。假设您的 home 目录中有一个 documents 目录,您想对其进行版本控制。首先,您需要使用以下命令创建一个新的空存储库svnadmin create命令。例如,以下命令在您的 home 目录中创建一个新的存储库
$ svnadmin create $HOME/.documents_repository
接下来,您需要将现有文档导入到新创建的存储库中。为此,请使用svn import命令,其中包含要导入的目录和指向存储库的 URL。在本例中,URL 使用 file:// 类型 URL 直接指向存储库。如果您的存储库仅在本地使用,则 file:// URL 是访问存储库的最简单方法(还有其他更好的访问存储库的方法,我稍后会讨论)
$ svn import $HOME/documents file://$HOME/.documents_repository
当您运行 import 命令时,Subversion 会打开一个编辑器并要求您输入日志消息。您输入的任何消息都将与新创建的存储库修订版本相关联,并且可以通过检查存储库历史日志来查看。输入一些简短的内容,例如“导入文档目录”。当您保存日志消息并离开编辑器后,Subversion 将执行导入并输出如下内容
Adding documents/file1.txt Adding documents/file2.txt Adding documents/file3.jpg Committed revision 1.
现在,您可以安全地删除原始的 $HOME/documents,然后使用以下命令将其重新创建为存储库的工作副本svn checkout命令
$ rm -rf $HOME/documents $ svn checkout file://$HOME/.documents_repository $HOME/documents
到目前为止,一切顺利。但是,如果您想从多台机器利用 Subversion,您需要设置一个服务器。您有几个选项可供选择,但通常最好的选择是使用带有 mod_dav 的 Apache,它使用 WebDAV 协议为 Subversion 存储库提供服务。
从基本的 Apache 安装开始,使 WebDAV 工作相当简单。首先,您需要确保 mod_dav 和 mod_dav_svn 正在加载
LoadModule dav_module modules/mod_dav.so LoadModule dav_svn_module modules/mod_dav_svn.so
接下来,您需要设置一个 <Location> 指令来指向您的存储库。例如,如果您希望使用 URL http://example.net/bill/documents 引用您的存储库,并且该存储库位于 /srv/repositories/bill_documents 中,则可以使用以下 Location 指令
<Location /bill/documents> DAV svn SVNPath /srv/repositories/bill_documents AuthType None </Location>
或者,如果您想要更高的安全性,您可以仅允许有效用户
<Location /bill/documents> DAV svn SVNPath /srv/repositories/bill_documents AuthType Basic AuthName "Bill's Documents" AuthUserFile /srv/repositories/bill_documents/passwd Require valid-user </Location>
现在您已经设置了 Subversion,让我们看看您需要了解的一些基本命令。基本命令行 Subversion 客户端程序称为 svn,您将使用的所有客户端命令都通过该程序访问。要获取可用命令的完整列表,您可以运行svn help。您也可以运行svn help [命令]以获取有关特定命令的帮助。
您需要知道的第一个基本命令是svn add。当您在工作副本中创建一个新文件时,Subversion 不会自动将其添加到存储库中。这样,您可以控制要版本控制的内容。例如,将 emacs scratch 文件添加到您的存储库通常是浪费空间。使用svn add很容易。您只需要提供要添加的任何文件或目录的名称,它们将被计划添加到存储库中,前提是它们位于有效的工作副本中。但请注意,我说的是“计划”。当您发出svn add命令时,Subversion 实际上尚未将文件添加到存储库中。相反,它计划在下次提交时添加它们。这样,您可以使用多个svn add命令添加多个文件,并将它们批量处理在一起,以便将它们作为单个修订版本提交,以及任何已版本控制的已在本地修改的文件。
那么什么是提交?好吧,当您修改工作副本中的文件时,数据不会自动发送到存储库。您需要使用svn commit将您的更改提交到存储库。commit 命令执行将您的本地更改实际发送到存储库以创建新修订版本的工作。通常,如果您在工作副本中,您可以简单地发出svn commit,不带任何选项,它将递归提交当前目录下的所有已更改文件。但是,如果您不想提交所有本地更改,您可以仅通过在命令行中列出某些文件来指定它们。
一旦文件添加到存储库,就可以在本地自由修改它,Subversion 会自动确定已进行了哪些更改,以便在您执行提交时将它们发送到存储库。但是,有一个限制。您不能仅使用标准的cp, mv或rm命令复制、移动或删除文件。如果您这样做,Subversion 将不知道该更改,并且将丢失对文件的跟踪。相反,您需要使用 Subversion 等效命令svn cp, svn mv和svn rm。从语法上讲,它们的工作方式与您习惯的本地版本大致相同,但它们还会计划将其各自的操作应用于下一次提交的存储库。
要查找工作副本中文件的当前状态,您可以使用svn status。status 命令显示您的信息,例如哪些文件不在版本控制之下,哪些文件已被修改以及哪些文件已计划添加。例如,以下输出显示了两个已修改的文件和一个尚未添加到存储库的文件
$ svn status ? .GroceryList.txt.swp M Frogs.png M GroceryList.txt
您还可以使用svn update命令将您的工作副本更新到最新修订版本。如果您仅从一台计算机访问 Subversion 存储库,则更新不是必需的。但是,如果文件是从多台计算机修改的,则您需要在工作副本中运行svn update以获取从另一台计算机提交的任何更改。
现在我已经解释了使用 Subversion 跟踪文件的困难方法,让我们看一下自动版本控制。当您使用 Apache 作为您的 Subversion 存储库服务器时,它使用 WebDAV 协议的扩展来回存储库传输文件。这带来的一个有趣的副作用是,大多数操作系统可以将共享的 WebDAV 目录挂载为网络文件系统,就像 Samba 或 NFS 一样。这意味着您可以挂载 Subversion 存储库并直接访问文件,而无需将它们本地存储在工作副本中。这可能具有几个优点,使其非常适合处理您的个人文件。首先,每次保存文件时都会创建一个新版本。这样,您就可以拥有文件的完整保存历史记录,而无需担心您最近是否进行了提交。您还可以通过创建文件将文件添加到存储库,并且可以使用标准文件系统命令执行复制、移动或删除操作。此外,如果您从多台计算机访问您的存储库,您始终知道您正在访问最新版本,而无需记住运行svn update.
当然,自动版本控制也有其缺点。首先,它需要与服务存储库的计算机建立相当快的网络连接,因此对于经常在家外使用的笔记本电脑来说可能不切实际;尽管如果您可以访问返回服务器的网络连接,则始终可以将文件复制到本地硬盘驱动器,编辑它们,然后再将它们复制回存储库。自动版本控制的另一个缺点是您只能访问最新的存储库修订版本。如果您想访问文件的旧版本,则必须在本地下载它们,这可以通过签出特定修订版本的目录来完成
$ svn checkout -r 1563 http://$MY_SERVER/docs/pics/
或者通过使用svn cat下载单个文件
$ svn cat -r 1563 http://$MY_SERVER/docs/pics/beach.jpg
如果您要使用自动版本控制在 Linux 下挂载您的存储库,您需要安装 davfs。安装完成后,挂载存储库很容易。您只需运行mount.davfs,就像以下示例一样,它将存储库 $MY_SERVER/docs 挂载到 /mnt/documents
$ mount.davfs http://$MY_SERVER/docs/ /mnt/documents
但是,在可以使用自动版本控制之前,您还需要在 Apache 中将其打开。为此,您需要将 SVNAutoversioning on 选项添加到 Subversion 存储库的 <Location> 指令中。
Subversion 是一个具有大量功能的系统,其中许多功能我甚至没有触及。但是,您现在应该已经了解了足够多的知识来开始对您的文件进行版本控制。我已经使用它来管理我的文件一段时间了,发现它非常有用。我发现它与自动版本控制结合使用时特别有用,这使其几乎与文件系统无缝集成。
本文的资源: /article/8751。
从 OS X 连接
好吧,我承认。我是个 Mac 用户。作为一名 Mac 用户,我的 PowerBook 在我的家庭网络上经常使用,因此能够从那里轻松访问我的文件对我来说非常重要。幸运的是,Subversion 让我的生活变得轻松。Subversion 在 OS X 上运行起来就像在 Linux 上一样容易,而且安装起来非常轻松。如果您使用 Fink 软件包管理系统在 Mac 上安装开源软件,您可以从那里安装 Subversion,或者您可以获取独立的二进制文件。
如果您决定利用自动版本控制,您也会对 OS X 非常满意。挂载自动版本控制的存储库就像从 Finder 的“前往”菜单中选择“连接到服务器...”并输入存储库的 URL 一样简单。存储库将挂载在 /Volumes 中,并且它将作为挂载的网络共享出现在桌面上。
从 Windows XP 连接
无论您将其用于游戏、工作、安抚不太懂技术配偶,还是仅仅因为您喜欢它,您的网络上很可能至少有一台 Windows 机器。好消息是,Subversion 被设计为跨平台应用程序,并且在 Windows 下得到了很好的支持。命令行客户端的预编译二进制文件可从 Subversion 下载页面获得。此外,Windows 有一个出色的 GUI 客户端,它与 Windows 资源管理器集成,称为 TortoiseSVN。
Windows XP 也通过 WebFolders 支持自动版本控制,尽管您需要使用旧的 Explorer 扩展版本的 WebFolders,而不是 WinXP 中引入的新版本,因为新版本存在不兼容性。要连接到存储库,您只需添加一个新的网络位置并输入存储库 URL,并附加端口号。例如,要连接到 example.com/documents 上的存储库,您将使用 URL http://example.com:80/documents。
William Nagel 是一家小型技术公司的首席软件工程师,也是 Subversion 版本控制:在开发项目中使用 Subversion 版本控制系统 的作者。可以通过 bill@williamnagel.net 与他联系。