SVN 基础使用小记

Subversion(SVN) 是一个开源的版本控制系統,管理着随时间改变的数据。这些数据放置在一个中央资料档案库(repository) 中。这个档案库很像一个普通的文件服务器, 不过它会记住每一次文件的变动。这样你就可以把档案恢复到旧的版本, 或是浏览文件的变动历史。

与之类似的还有 CVS 与 Git,CVS 已经淘汰,不再赘述。SVN是集中式,Git是分布式。

术语

  • Repository (存储库): 统一存放源代码
  • Checkout (检出): 从远程存储库拉取代码
  • Commit (提交): 推送本地变动至远程存储库
  • Update (更新): 同步远程存储库变更

关系图

![[1654966063189.jpg]]

基本使用

创建存储库

存储库相当于一个集中的空间,用于存放开发者所有的工作成果。版本库不仅能存放文件,还包括了每次修改的历史,即每个文件的变动历史。

Create 操作是用来创建一个新的存储库,只有管理员才能进行此操作。当你创建一个新的存储库时,需要向版本控制系统提供一些信息以标识存储库,例如创建位置和存储库名称。

检出

Checkout 操作用来从版本库创建一个工作副本。工作副本是开发者私人的工作空间,可以进行内容的修改,然后提交到远程存储库中。

1
svn checkout svn://192.168.0.1/runoob01 project01

svn://192.168.0.1/runoob01 为远程存储库地址,末尾 project01 用于指定存储库保存在本地的名称。

添加 --depth 参数可指定要检出的深度,以下示例仅从存储库中检出一个空目录,不包含其下的文件及目录。

1
svn checkout --depth=empty svn://192.168.0.1/runoob01 project01

添加

将文件/目录添加到存储库中。

1
svn add .

将文件/目录添加到存储库中,自动忽略先前已加入存储库的文件/目录。

1
svn add --force .

更新

Update 操作用于同步远程存储库,这个操作将工作副本与远程存储库进行同步。存储库是由整个团队共用,当其他成员提交改动之后,本地工作副本就会过期(与远程库内容不一致),进而需要进行同步。

1
svn update

添加 -r 参数可指定更新到的目标版本,例如 -r6 表示更新到版本 6。

提交

当检出存储库之后,可以对工作副本中的数据进行编辑、删除、重命名、添加文件/目录等操作。但是这些变动不会立刻应用到远程存储库,而是被添加进待变更列表中,直到执行 commit 操作后才会被应用到远程存储库。

1
svn commit -m "对本次提交的描述信息"

查看变动

检出工作副本或者更新工作副本后,,对工作副本进行的一些修改,会使工作副本与远程存储库数据出现差异,Status 操作列出了工作副本中所有的变动。在 commit 操作之前复查下变动是一个很好的习惯。

工作副本的任何改动都会成为待变更列表的一部分,不需要手动执行 add 操作。

1
svn status

添加 --no-ignore 参数,可查看包含已忽略文件/目录的待变更列表。

回退

Revert 操作恢复对工作副本的修改。其可以恢复一个或多个文件/目录,也可以恢复整个工作副本。恢复整个工作副本时,将会销毁待变更列表并将工作副本恢复到原始状态。

1
svn revert 文件名/目录

忽略文件/文件夹

查看当前目录的忽略规则,可在最后添加径指定要查看的目录。

1
svn proplist -v

编辑当前目录的忽略规则,可在最后添加径指定要编辑的目录,--editor-cmd 参数用于指定要使用的编辑器。

1
svn propedit svn:ignore

忽略当前目录下名称为 ignoreThis.txt 文件。

1
svn propset svn:ignore "ignoreThis.txt" 

忽略当前目录及其子目录中名称为 ignoreThis.txt 的文件。

1
svn propset svn:global-ignores "ignoreThis.txt" .

根据配置文件忽略文件或目录:

1
svn propset svn:ignore -R -F .svnignore .

-F 指定配置文件,-R 表示同时将忽略规则应用到所有子目录,末尾的 . 表示要应用到的路径(示例中是当前目录)。

删除文件/目录

从本地以及存储库中删除文件/目录。添加 --keep-local 参数可指定仅删除存储库中的文件/目录,保留本地文件。

1
svn delete [ 文件名称 / 目录名称 ]

其他

  • svn log: 用来展示svn 的版本作者、日期、路径等等。
  • svn diff: 用来显示特定修改的行级详细信息。
  • svn cat: 取得特定版本的某文件数据并显示在当前屏幕。
  • svn list: 显示一个目录或某一版本存在的文件。

杂项

将变更提交至远程存储库时,如果版本不一致,将需要进行合并 (Merge) 操作,SVN 会自动处理可以安全合并的行,其它的会被当做冲突。例如,“hello.c” 文件在一个分支上被修改,在另一个分支上被删除了。这种情况就需要人为处理。Resolve 操作就是用来帮助用户找出冲突并告诉版本库如何处理这些冲突

SVN 以行为单位管理源代码,多个工程师只要不是修改了同一行,SVN 都能够自动合并修改。如果修改到同一行,SVN 会提示文件 Conflict (冲突),需要手动合并。

参考资料

Licensed under CC BY-NC-SA 4.0