本手册是为了描述 Subversion 1.6.x 系列而编写的。如果您正在运行不同版本的 Subversion,强烈建议您访问 https://svnbook.subversion.org.cn/ 并查阅适合您 Subversion 版本的手册。

名称

svn checkout (co) — 从仓库签出工作副本。

概要

svn checkout URL[@REV]... [PATH]

描述

从仓库签出一个工作副本。如果省略了 PATH,则会使用 URL 的基本名称作为目标。如果给出了多个 URL,则每个 URL 都将签出到 PATH 的子目录中,子目录的名称为 URL 的基本名称。

选项

--depth ARG
--force
--ignore-externals
--quiet (-q)
--revision (-r) REV

示例

签出一个名为 mine 的工作副本

$ svn checkout file:///var/svn/repos/test mine
A    mine/a
A    mine/b
A    mine/c
A    mine/d
Checked out revision 20.
$ ls
mine
$

将两个不同的目录签出到两个独立的工作副本中

$ svn checkout file:///var/svn/repos/test \
               file:///var/svn/repos/quiz
A    test/a
A    test/b
A    test/c
A    test/d
Checked out revision 20.
A    quiz/l
A    quiz/m
Checked out revision 13.
$ ls
quiz  test
$

将两个不同的目录签出到两个独立的工作副本中,但将它们都放在名为 working-copies 的目录中

$ svn checkout file:///var/svn/repos/test \
               file:///var/svn/repos/quiz \
               working-copies
A    working-copies/test/a
A    working-copies/test/b
A    working-copies/test/c
A    working-copies/test/d
Checked out revision 20.
A    working-copies/quiz/l
A    working-copies/quiz/m
Checked out revision 13.
$ ls
working-copies

如果您中断了一个签出(或者其他情况导致签出中断,例如失去连接等),您可以通过再次发出相同的签出命令或更新不完整的工作副本来重新启动它

$ svn checkout file:///var/svn/repos/test mine
A    mine/a
A    mine/b
^C
svn: The operation was interrupted
svn: caught SIGINT
$ svn checkout file:///var/svn/repos/test mine
A    mine/c
^C
svn: The operation was interrupted
svn: caught SIGINT
$ svn update mine
A    mine/d
Updated to revision 20.
$

如果您希望签出除最新版本之外的其他版本,您可以通过向 svn checkout 命令提供 --revision (-r) 选项来实现

$ svn checkout -r 2 file:///var/svn/repos/test mine
A    mine/a
Checked out revision 2.
$

如果您尝试将目录签出到包含文件或子目录(签出本身将创建这些文件或子目录)的现有目录之上,Subversion 默认情况下会报错。使用 --force 选项可以覆盖此安全措施。当您使用 --force 选项签出时,签出目标树中任何通常会阻止签出的未版本化文件都将变成版本化文件,但 Subversion 将保留其内容。如果这些内容与存储库中该路径的文件不同(该文件是作为签出的一部分下载的),则在签出完成后,该文件将显示为具有本地修改——将您签出的版本化文件转换为签出前未版本化文件的更改。

$ mkdir project
$ mkdir project/lib
$ touch project/lib/file.c
$ svn checkout file:///var/svn/repos/project/trunk project
svn: Failed to add directory 'project/lib': an unversioned directory of the sa
me name already exists
$ svn checkout file:///var/svn/repos/project/trunk project --force
E    project/lib
A    project/lib/subdir
E    project/lib/file.c
A    project/lib/anotherfile.c
A    project/include/header.h
Checked out revision 21.
$ svn status wc
M       project/lib/file.c
$ svn diff wc
Index: project/lib/file.c
===================================================================
--- project/lib/file.c	(revision 1)
+++ project/lib/file.c	(working copy)
@@ -3 +0,0 @@
-/* file.c: Code for acting file-ishly. */
-#include <stdio.h>
-/* Not feeling particularly creative today. */

$

与其他工作副本一样,您有以下可用的选择:还原一些或所有这些本地 修改,提交它们,或者继续修改您的工作副本。

此功能对于执行未版本化目录树的原位导入特别有用。通过首先将树导入到存储库中,然后使用 --force 选项将新的存储库位置签出到未版本化树之上,您可以有效地将未版本化树转换为工作副本。

$ svn mkdir -m "Create newproject project root." \
      file://var/svn/repos/newproject
$ svn import -m "Import initial newproject codebase." newproject \
      file://var/svn/repos/newproject/trunk
Adding         newproject/include
Adding         newproject/include/newproject.h
Adding         newproject/lib
Adding         newproject/lib/helpers.c
Adding         newproject/lib/base.c
Adding         newproject/notes
Adding         newproject/notes/README

Committed revision 22.
$ svn checkout file://`pwd`/repos-1.6/newproject/trunk newproject --force
E    newproject/include
E    newproject/include/newproject.h
E    newproject/lib
E    newproject/lib/helpers.c
E    newproject/lib/base.c
E    newproject/notes
E    newproject/notes/README
Checked out revision 2.
$ svn status newproject
$