在SVN中,checkout和export有什么区别?

79

SVN checkout 和 SVN export 的确切区别是什么?

据我所知,export 不包括 .svn 目录,该目录包含元数据,而 checkout 包括该 .svn 目录。然而,我的同事最近遇到了这个问题:从 SVN 存储库中编译的源代码和通过 SVN 导出得到的代码之间存在不同的行为。它们都编译正确,但是从 svn export 编译的代码可以工作,但是从 checkout 得到的代码根本无法工作。

PS:正在编译的内容是用于嵌入式设备中的 Linux 2.4 内核。镜像编译并正确加载,但是被 checkout 出来的内核不工作,并在 insmod 过程中引起内核崩溃。为什么会发生这种情况呢?

PPS:我们尝试使用校验和和 diff 工具检查了从 SVN 导出和 checkout 得到的两个目录之间的差异。除了 .svn 目录外,它们都是相同的。


6
很抱歉,您的问题标题不幸地引发了对结账和导出之间区别的大量解释。提及崩溃可能会带来更好的帮助。 - gbarry
9个回答

108

svn export 命令只是提取特定版本的所有文件而不允许对其进行版本控制。同时,它不会在每个目录中添加 .svn 目录。

svn checkout 命令则允许您在所创建的目录中使用版本控制,例如标准命令 svn updatesvn commit


16
请注意,这并不是他需要了解的内容。 - gbarry

11

正如您所述,检出包括 .svn 目录。因此,它是一个工作副本,并且将具有适当的信息以便进行提交(如果您有权限)。如果您执行导出操作,则只需获取当前存储库状态的副本,并且将没有任何方法提交任何更改。


9

您是要将结帐或导出重新运行到现有目录中吗?

如果是这样,结帐将更新工作副本,包括删除任何文件。

但是,导出将简单地将所有文件从存储库传输到目标位置 - 如果目标位置是同一目录,则意味着在存储库中删除的任何文件都不会被删除。

因此,您的导出副本可能仅能正常工作,因为它依赖于已在存储库中删除的文件?


谢谢,这对我很有用,因为即使提交后我的已删除文件仍然显示出来,原因是我使用的是svn export而不是svn checkout。 - useranon

6

有没有可能构建过程查看了子目录并包含了不应该的内容?顺便说一下,您可以进行合法的检出,然后删除.svn及其所有内容。这将给您与导出相同的结果。在删除元数据之前和之后尝试编译它。


我们以前尝试过这个,但对我们来说并没有奏效,这真的让我们双方都感到沮丧。 - andycjw
你是在比较一个新的检出版本和一个曾经被检出并更新到导出版本的仓库吗?如果是后者,你可能会有一些无用的东西留在那里,会被拉入构建中。 - unwesen
等等...!“不工作”是什么意思?是构建成功但实验失败,还是构建失败从而证明元数据是导致混淆的原因? - gbarry
“not working” 在这里指的是使用“find . -name .svn | xargs rm -rf”命令清除了合法的检出并剥离了“.svn”文件夹后,构建无法像导出一样正常工作。因为众所周知,导出只是没有版本控制的“.svn”元数据的检出。 - andycjw
所以,现在,如果您要删除.svn的部分(或者可能只是一个空的.svn),您可以“分而治之”,最终发现导致它失败的原因。无论如何,如果有无限时间的话。您已经对两个内核映像进行了差异比较吗?(以及模块映像?) - gbarry

2

如果您想上传(或提供给他人)项目,请使用导出。如果您正在处理项目,请使用检出。


2
(为了补充Gerald的回答...) 另一个微妙的区别是,尽管命令:svn checkout ...repos_location/my_dir .将文件放入当前目录(带有.svn文件夹)中,但在某些版本的svn中,命令:svn export ...repos_location/my_dir .将在当前目录中创建一个名为my_dir的文件夹,并将导出的文件放入其中。

1

额外的思考。你说insmod崩溃了。Insmod加载模块。这些模块是从构建内核的另一个编译操作中构建的。内核和模块必须从相同的头文件等构建。所有模块都是在内核构建期间构建的,还是它们是“现有的”?

另一个想法,我对此知之甚少,就是svn externals,如果使用,可能会影响到你的项目检出内容。查看并查看导出时是否有任何不同。


0
非常简单的区别,如果你只想查看项目的结构,那就选择导出。
而如果你想在文件上工作,那么你需要检出,因为它会包含 .svn 文件夹,其中包含元数据,用于生成工作副本,否则导出过程中会出现错误。
如果你执行了 svn export,然后编辑一些文件并提交,那么你将会得到一个错误提示:
“../../xxx 不是你的工作副本。”

-1
如果你正在使用Tortoise SVN客户端,在导出时会显示“..export / checkout”,这可能会让人感到困惑,实际上它只是导出操作。只有在查看/阅读时才使用导出,要提交更改请使用“checkout”。

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