SVN结帐和SVN导出之间的确切区别是什么?
据我所知,export不包含包含元数据的.svn目录,而checkout包含.svn目录。然而,我的同事最近遇到了这个问题,从结账和从SVN回购导出的资源编译的东西有不同的行为。它们都编译正确,但是从svn export
编译的那个有效,但签出的那个根本不起作用。
PS:正在编译的东西是在嵌入式设备中使用的Linux 2.4内核。图像正确编译和加载,但签出的图像不起作用。它会在insmod期间导致内核崩溃。为什么会发生这种情况?
PPS:我们尝试使用校验和和差异工具来检查从SVN导出和签出的两个目录之间的区别。除.svn目录外,它们都是相同的。
答案 0 :(得分:101)
svn export
只是从修订中提取所有文件,并且不允许对其进行修订控制。它也不会使用.svn目录丢弃每个目录。
svn checkout
允许您在目录中使用版本控制,例如您的标准命令,例如svn update
和svn commit
。
答案 1 :(得分:11)
正如您所说,结帐包含.svn目录。因此,它是一个工作副本,并将提供适当的信息以提交回来(如果您有权限)。如果您执行导出,则只需获取存储库当前状态的副本,并且无法以任何方式提交任何更改。
答案 2 :(得分:8)
您是在重新运行结帐还是导出到现有目录?
因为如果是,checkout将更新工作副本,包括删除任何文件。
但是导出只会将所有文件从reporsitory传输到目标 - 如果目标是同一目录,这意味着存储库中删除的任何文件都不会被删除。
因此,导出副本可能只能使用,因为它依赖于已在存储库中删除的文件?
答案 3 :(得分:6)
构建过程是否有机会查看子目录并包含它不应包含的内容?顺便说一句,你可以做一个合法的结账,然后删除.svn及其包含的全部内容。这应该给你与出口相同。尝试在删除元数据之前和之后对其进行编译。
答案 4 :(得分:2)
(补充杰拉尔德的回答......) 另一个微妙的区别是,虽然命令:
svn checkout ...repos_location/my_dir .
将my_dir
中的文件放入当前目录(使用.svn
文件夹)
在某些版本的svn中,命令:
svn export ...repos_location/my_dir .
将在当前目录中创建一个名为my_dir
的文件夹,然后将导出的文件放在其中。
答案 5 :(得分:1)
如果要上传(或提供给某人)项目,请使用导出。如果您正在使用项目,请使用结帐。
答案 6 :(得分:1)
额外的沉思。你说insmod崩溃了。 Insmod加载模块。这些模块是在构建内核的另一个编译操作中构建的。内核和模块必须使用相同的标头构建,依此类推。是否在内核构建期间构建了所有模块,或者它们是否“存在”?
另一个想法,以及我不了解的东西,是svn externals,它(如果使用的话)会影响你的项目签出的内容。查看导出时是否有任何不同。
答案 7 :(得分:0)
非常简单的区别,如果您只想查看项目的结构,那么就去导出。
如果您想处理您的文件,那么您需要结帐,因为它将包含.svn文件夹,其中包含生成工作副本的元数据,否则您在导出时会收到错误。
如果您执行svn export
然后编辑某些文件然后提交,那么您将收到错误:
../../ xxx不是您的工作副本。
答案 8 :(得分:-1)
如果您正在使用Torvise svn客户端-在导出时-它显示..export / checkout,这很令人困惑,仅是导出。仅查看/读取使用导出,以提交使用-“结帐”