Subversion - SVN checkout和SVN update命令有什么区别?

49

我了解"SVN checkout"命令会将文件从Subversion仓库中取出并拷贝到本地工作目录/副本中,而"SVN update"命令则会从仓库中获取文件的更改,如果其他人进行了更改。

但是在我看来,“update”只是“checkout”的一个特殊情况,也就是说,当发生“checkout”时,它会获取所有文件,因为本地尚不存在任何文件,因此所有文件都“已更改”,在幕后这些命令基本上执行相同的操作。我认为这些命令之所以分开存在,只是为了简化操作?

或者,这些命令之间还有其他区别,例如,“SVN update”是否会获取新文件(仓库中存在但您的工作副本中没有的文件),还是只更新现有文件?


1
还有一个相关的命令是"svn export"。这个命令会从代码仓库中下载文件,但不会创建工作副本。你将无法从导出的文件提交更改。 - Mike Miller
这只是用于只读或“浏览”类型的目的吗?它把它们放在哪里,一些临时目录中吗? - Emilio
1
不,它将是一个可写的副本,只是不包含任何隐藏的.svn目录来跟踪更改。 - Dave Van den Eynde
6个回答

46

在我看来,两者的主要区别是,checkout创建一个工作副本,而update则是将变更应用到已有的工作副本上。


8
在我看来,这并没有回答问题,因为这个区别已经包含在问题中了。很明显这两个命令有不同的语义,但是它们在技术上有什么不同呢?它们不是实际上做着相同的事情,只是一个在开始时执行,另一个在稍后执行吗? - Golo Roden

17

svn checkout 会将仓库中给定目录在指定版本(默认为HEAD)下的所有有版本控制的文件复制到本地机器,并生成包含元数据的隐藏.svn目录,使这些文件成为工作拷贝。

svn export 会将仓库中给定目录在指定版本(默认为HEAD)下的所有有版本控制的文件复制到本地机器,但是会产生一个标准的目录层次结构。(它不会产生可更新或可检查的工作副本)。

svn update 会对现有的工作副本应用变更。如果发现冲突,则提示用户必须在提交任何更改之前解决冲突。使用 svn commit 前必须确保待提交的工作副本是最新的(即与HEAD相同版本)。


1
我不确定你在工作副本更新之前提交的前提条件是否完全正确。从技术上讲,我认为你是可以在没有更新的情况下进行提交的。然而,我猜这并不被推荐,并且应该非常小心地实践。此外,我不知道什么时候会想要在没有先更新的情况下进行提交。 - Dror
@Dror 是的,你说得对!在提交之前更新是最佳实践,尽管有时候Subversion在没有更新的情况下无法提交,它会弹出错误提示要求先更新再提交。 - Hamza Saeed

12

更新操作将会把你在代码库中已检出的版本更新到最新的版本(或指定的其他版本)。如果你对本地工作副本进行了更改,那么这些更改将在更新后被保留。如果代码库中添加或删除了文件,则会反映在你的工作副本中。如果本地副本和代码库中都有更改,SVN 将尝试为你合并所有更改。如果无法自动合并,则会标记冲突,需要手动解决。


当然可以更新到最新版本。如果您将HEAD指定为修订版,或者根本不指定修订版,那么这就是svn update所做的事情。 - Mike Miller

3

Subversion使用隐藏的元数据目录来实现其功能。这些.svn目录使一个目录成为Subversion工作副本——没有这些目录,它只是一个目录,Subversion无法对其进行操作。

UPDATE是在Subversion工作副本上执行的操作;没有.svn目录,就不能进行UPDATE操作。CHECKOUT是创建工作副本的操作。


2

svn update 只会将用户版本和最新版本之间的差异进行更新。如果没有差异,就不进行任何操作。

但是 checkout 命令会创建一个新目录,并将该分支的所有文件带入其中。如果我们需要经常更改工作的分支,checkout 是一个不错的选择。而当我们有一个主干版本,并需要获取他人在该主干版本上完成的更新时,就需要使用 update 命令。


1
在使用SVN时,checkout和update的重要区别在于:您只能使用checkout命令一次建立本地目录与版本控制下的仓库之间的关系并将所有文件从根仓库复制到本地工作目录。之后,使用checkout更新本地目录中的副本将生成以下错误:
svn: E175002: 无法连接到仓库URL'https://********'。
svn: E175002: OPTIONS请求返回无效XML响应:****。"
更新本地目录中的当前版本的唯一方法是使用svn update命令。

1
你看到这个行为时使用的是哪个 SVN 版本?我刚刚执行了一个“重新检出”操作,它看起来只是将其解释为更新。我正在运行 svn, version 1.8.9 (r1591380) - jxramos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接