SVN中签出和导出的区别
SVN checkout和SVN导出有什么区别?
据我所知,导出不包括包含元数据的.svn目录,结帐包括.svn目录。 然而,我的同事最近有这个问题,从SVN回购结算和导出的来源编译的东西有不同的行为。 他们都编译正确,但从svn export
编译的工作,但检出了一个根本不工作。
PS:被编译的东西是在embedded式设备中使用的Linux 2.4内核。 图像编译和加载正确,但检出一个不起作用。 它在insmod期间导致内核恐慌。 为什么会发生这一切?
PPS:我们试着用checksum和diff工具来检查从SVN导出和检出的两个目录之间的区别。 除了.svn目录外,它们都是相同的。
svn export
只是从一个版本中提取所有的文件,并且不允许对其进行版本控制。 它也不会用.svn目录清理每个目录。
svn checkout
允许你在目录中使用版本控制,比如你的标准命令,如svn update
和svn commit
。
如您所述,结帐包括.svn目录。 因此,它是一个工作副本,并将有适当的信息提交回来(如果您有权限)。 如果您执行导出操作,您只需要获取存储库当前状态的副本,并且将无法回退任何更改。
你是否正在重新运行你的结账或导出到一个现有的目录?
因为如果你是,结帐会更新工作副本,包括删除任何文件。
但导出只是将所有文件从reporsitory转移到目标 – 如果目标是相同的目录,这意味着在存储库中删除的任何文件都不会被删除。
所以你导出副本可能只能工作,因为它依赖于已在存储库中删除的文件?
任何构build过程都在考虑子目录,包括它不应该包含的东西? 顺便说一句,你可以做一个合法的结帐,然后删除.svn及其中包含的所有内容。 这应该给你一样的出口。 尝试在删除元数据之前和之后进行编译,就像那样。
(为了补充杰拉尔德的回答…)另一个微妙的区别是,虽然命令:
svn checkout ...repos_location/my_dir .
将文件my_dir
放到当前目录(使用.svn
文件夹)
在某些版本的svn中,命令:
svn export ...repos_location/my_dir .
将在当前目录中创build一个名为my_dir
的文件夹,然后将导出的文件放入其中。
额外的沉思。 你说insmod崩溃。 Insmod加载模块。 这些模块是在构build内核的另一个编译操作中构build的。 内核和模块必须由相同的头文件等构build。 所有的模块是在内核构build过程中构build的,还是“现有的”?
另外一个想法,以及我所知甚less的是svn externals,它(如果使用的话)会影响你的项目签出的内容。 看看导出时是否有什么不同。
如果您想上传(或提供给某人)一个项目,请使用导出。 如果您正在处理项目,请使用结帐。
非常简单的区别,如果你只是想看到你的项目的结构,然后去出口。
如果你想处理你的文件,那么你需要签出,因为它将包含.svn文件夹,其中包含使工作副本的元数据,否则你会得到导出错误。
如果您执行svn export
,然后编辑一些文件,然后提交,那么你会得到一个错误:
../../xxx不是你的工作副本。