svn开始使用svn


备注

Apache Subversion(SVN)是一个通用的集中式开源版本控制系统。 Subversion目前是Apache Software Foundation(ASF)下的一个项目,并根据Apache License 2.0版获得许可

Subversion旨在管理和控制文件和目录,并跟踪对它们所做的更改;它是协作开发项目的可靠时间机器管理工具 。它可以轻松回答任何版本控制系统必须可靠回答的标准问题。例如,

  • 项目/档案FOO在2012年12月12日是怎样的?
  • USERNAME或2012年12月20日引入了哪些更改?
  • 谁修改了自上次审核以来的特定字符串?
  • 还有更多。

版本

什么是新的? 发布日期
1.9.x的 众多可用性和性能改进 2015年8月5日
1.8.x的 改进的重命名跟踪,自动重新集成合并,继承的版本化属性,内置冲突解决工具 2013年6月18日
1.7.x 完全重写工作副本库,改进HTTP协议使用 2011-10-11
1.6.x版 识别树冲突,改进交互式冲突解决,支持repo-relative URL 2009-03-20
1.5.x的 合并和分支跟踪( svn:mergeinfo ),交互式文件冲突解决,稀疏检出,改进的svn:externals语法 2008-06-19
1.4.X 用于存储库复制的svnsync工具,新的和改进的工作副本库 2006-09-10
1.3.x的 在服务器端高级记录用户操作,提高性能 2005-12-30
1.2.x版本 支持锁定 - 修改 - 解锁模型(即锁定),DAV自动转发,FSFS默认用于新存储库 2005-05-21
1.1.x版本 新的存储库后端(FSFS),符号链接版本控制 2004-09-29
1.0.x的首次公开发布 2004-02-23

Apache Subversion 1.9.x是目前最全面和最好的SVN版本,完全支持。部分支持Subversion 1.8.x.不再支持Subversion 1.7.x及更早版本。

安装和初始设置

安装svn 客户端以开始协作使用Subversion作为其版本控制系统的项目。

要安装Subversion,您可以从源代码版本自行构建或下载为您的操作系统预先构建的二进制包。可以在官方二进制包页面上找到可以获取各种操作系统的已编译Subversion客户端( svn )的站点列表。如果您想为自己编译软件,请在源代码页面上获取源代码

使用Subversion,您不仅可以使用标准的svn 命令行客户端。有一些着名的图形Subversion客户端用于各种操作系统,现在大多数IDE提供开箱即用或通过插件与SVN的强大集成。有关图形客户端列表,请查看Wikipedia页面: https//en.wikipedia.org/wiki/Comparison_of_Subversion_clients

在安装客户端之后,您应该能够通过发出命令svn 来运行它。你应该看到以下内容:

$ svn
Type 'svn help' for usage.
 

一切都准备好了。现在,您应该创建一个名为工作副本的本地工作区,该工作区将连接到远程中央存储库 。换句话说,您将要结帐工作副本 。您将在工作副本的帮助下使用版本化数据进行操作,并可以发布您的更改(在SVN中称为提交 ),以便在同一项目中工作的其他人可以看到它们并从您的更改中受益。要稍后从存储库中获取其他人所做的更改,您将更新工作副本 。其他示例中介绍了这些基本操作。

签出工作副本

要开始修改项目的数据,您必须获取版本化项目的本地副本。使用命令行svn 客户端或您最喜欢的SVN客户端(例如TortoiseSVN)。您的本地项目副本在Subversion中称为工作副本 ,您可以通过发出命令svn checkout <URL> 获取它,其中<URL> 是存储库URL。例如

$ svn checkout https://svn.example.com/svn/MyRepo/MyProject/trunk
 

或者,您可以使用svn co <URL> 作为速记来签出本地副本。

因此,您将获得一个名为MyProject的项目的/trunk 的工作副本,该项目位于MyRepo存储库中。工作副本将位于计算机上名为trunk 的目录中,相对于您发出命令的目录。

如果您希望为工作副本指定不同的名称,可以将其作为参数添加到命令的末尾。例如

$ svn checkout https://svn.example.com/svn/MyRepo/MyProject/trunk MyProjectSource
 

这将创建一个名为MyProjectSource 的工作副本。

请注意,您可以检查一些分支,私有货架或标签(假设它们已经存在于存储库中),而不是检查主干。您可以在您的计算机上拥有无限数量的本地工作副本。

您也可以获得整个存储库MyRepo的工作副本。但你应该避免这样做。一般来说,你不需要把整个仓库的工作副本为你的工作,因为你的工作副本可以立即切换到另一个发展分支/标签/不管。此外,Subversion存储库可以包含许多(非)相关项目,最好为每个项目都有一个专用的工作副本,而不是所有项目的单个工作副本。

签出特定修订版的工作副本

要获得版本5394,请使用:

svn co --revision r5394 https://svn.example.com/svn/MyRepo/MyProject/trunk
 

或者更短的版本:

svn co -r 5394 https://svn.example.com/svn/MyRepo/MyProject/trunk
 

或者使用挂钩修订:

svn co https://svn.example.com/svn/MyRepo/MyProject/trunk@5394
 

如果已经签出,则可以使用update 命令将a移动到特定修订,方法是:

svn up -rXXX
 

提交对存储库的本地更改

要发布在工作副本中所做的更改,请运行svn commit 命令。

重要信息:在提交之前检查您的更改!使用svn status svn diff 查看更改。此外,在执行提交之前,请确保您处于正确的路径中。如果您在各个目录中更新了许多文件,则应该处于适当的级别,以便在您的位置下包含所有文件。

以下是commit命令的示例:

svn commit -m "My Descriptive Log Message"
 

或者, svn cisvn commit 的简写

请注意-m (--message) 选项。良好的提交消息可帮助其他人理解提交的原因。此外,在服务器端,可以强制执行非空消息 ,甚至强制每个提交消息在您的错误跟踪系统中提到现有票证。

创建和应用补丁

修补程序是一个文件,显示两个修订版之间或本地存储库与存储库指向的最新修订版之间的差异。

要共享或保存本地未提交更改的修补程序,以供同行评审或稍后应用,请执行以下操作:

svn diff > new-feature.patch
 

要从两个修订版之间的差异中获取补丁:

svn diff -r NEWER_REVISION:OLDER_REVISION > feature.patch
 

要应用补丁,请运行:

svn patch new-feature.patch
 

要成功应用修补程序,必须从创建修补程序的同一路径运行该命令。

导出版本化数据(普通下载)

如果要获取版本化项目的数据,但不需要Subversion提供的任何版本控制功能,则可以运行svn export <URL> 命令。这是一个例子:

$ svn export https://svn.example.com/svn/MyRepo/MyProject/trunk
 

因此,您将获得项目的数据导出,但与工作副本不同,您将无法在其上运行svn 命令。导出只是简单的数据下载。

如果以后您想要将下载的数据转换为功能齐全的工作副本,请运行svn checkout <URL> 到您运行导出到的目录。

在本地工作副本中进行更改

工作副本(WC)是您用于与中央Subversion存储库交互的本地和私有工作空间 。您可以使用工作副本来修改项目的内容并获取其他人提交的更改。

工作副本包含项目的数据,其外观和行为类似于本地文件系统上的常规目录,但有一个主要区别 - 工作副本跟踪文件和目录中的状态和更改。您可以将工作副本视为常规目录,其根目录中隐藏的.svn 元数据目录添加了版本控制风格。

大多数情况下,您将通过修改工作副本的内容来执行对项目数据的修改。只要您对修改感到满意并且已经彻底检查过它们,就可以将它们发布到中央存储库。

您可以在工作副本中对项目的数据执行任何操作,但必须使用相应的svn 命令执行涉及复制,移动,重命名和删除的操作:

  • 修改现有文件 。像往常一样使用您喜欢的文本处理器,图形编辑器,音频编辑软件,IDE等修改文件。只要将更改保存到磁盘,Subversion就会自动识别它们。

  • 添加新文件 。将新文件放入工作副本,Subversion会将它们识别为无版本 。除非您运行svn add 命令,否则它不会自动开始跟踪新文件:

    svn add foo.cs
     
  • 移动文件和目录 。使用svn move 命令移动文件和目录:

    svn move foo.cs bar.cs
     
  • 重命名文件和目录 。使用svn rename 命令重命名文件和目录:

    svn rename foo.cs bar.cs
     

    注意: svn rename 命令是svn move 命令的别名。

  • 复制文件和目录 。使用svn copy 命令复制文件和目录:

    svn copy foo.cs bar.cs
     
  • 删除文件和目录 。使用svn delete 命令删除文件和目录:

    svn delete foo.cs
     
  • 检查工作副本中的文件和目录的状态 。使用svn status (或简称svn st )命令检查您的更改:

    svn status
     

    重要信息:在提交之前,请务必检查更改。这有助于您避免进行不必要或不相关的更改。

  • 还原更改 。使用svn revert 命令恢复您的更改:

    svn revert foo.c
     
  • 还原所有更改 :从存储库的根目录:

    svn revert -R .
     

    重要信息:恢复的未提交更改将永久丢失。您将无法恢复还原的更改。谨慎使用svn revert !如果要保留更改但需要还原,请将其保存在修补程序中。请参阅如何创建和应用修补程序的示例。

还原或回滚文件

要将文件恢复到最新更新的svn版本,即撤消本地更改,您可以使用revert

svn revert file
 

要将文件还原到旧版本(修订版XXX),请使用update

svn update -r XXX file
 

警告 :在这两种情况下,您将丢失文件中的任何本地更改,因为它将被覆盖。


要仅查看文件的旧版本,请使用cat

svn cat -r XXX file
 

并查看与本地文件版本的差异:

svn diff -r XXX file
 

查看日志

运行svn log 会显示所有提交消息,您可能只想查看某些修订。

  • 查看最新的n 版本:

    svn log -n

  • 查看特定修订:

    svn log -c rXXX

  • 查看受影响的路径:

    svn log -v -c rXXX

更新工作副本

你不是唯一一个从事该项目的人,对吗?这意味着您的同事也在对项目数据进行修改。要保持最新并获取其他人提交的修改,您应该在工作副本中运行svn update 命令。因此,您的工作副本将与存储库同步并下载您的同事所做的更改。

svn update 简写是svn up

在提交更改之前运行svn update 是一项规则。

使用受密码保护的存储库

可以配置Subversion存储库,以便某些用户只能访问某些内容或命令。要访问此受限制的内容,您需要指定用户名和密码。

您的用户名和密码可以直接指定为命令的一部分:

$ svn checkout https://svn.example.com/MyRepo/trunk --username JoeUser --password topsecret
 

不幸的是,这会导致您的密码以明文形式出现在控制台上。要避免此可能的安全问题,请指定用户名但不指定密码。这样做会导致出现密码提示,允许您输入密码而不会泄露密码:

$ svn checkout https://svn.example.com/MyRepo/trunk --username JoeUser
Password for 'JoeUser':
 

根本不提供身份验证信息会导致Subversion提示您输入用户名和密码:

$ svn checkout https://svn.example.com/MyRepo/trunk
Username:  JoeUser
Password for 'JoeUser':
 

虽然第一种方法不太安全,但在自动脚本中经常出现,因为很多类型的脚本很难向交互式提示提供信息。

注意 :仅对您的工作副本(例如revertstatus )进行操作的命令将永远不需要密码,只需要需要与存储库服务器通信的命令。