SVN:供应商分支机构+;修补+;历史

SVN:供应商分支机构+;修补+;历史,svn,version-control,external,patch,vendor-branch,Svn,Version Control,External,Patch,Vendor Branch,我们有一个相当大的库,需要定期导入(然后修补)到我们的代码库中 SVN手册似乎提出了一个“供应商分支”方案,我们保留了“供应商删除”的修补版本。这将起作用,但供应商也使用SVN并向我们提供对其reop的读取权限 当我们需要更新补丁程序时,若能够访问供应商文件的历史记录,那个就太好了 所以我的问题是: 有没有一种方法可以让经过修补的“供应商分支”以某种方式保持对供应商文件历史记录的访问 (我看到有人提到svn:external folders,但我不确定我是否真的理解与修订挂钩的全部后果,也不确定

我们有一个相当大的库,需要定期导入(然后修补)到我们的代码库中

SVN手册似乎提出了一个“供应商分支”方案,我们保留了“供应商删除”的修补版本。这将起作用,但供应商也使用SVN并向我们提供对其reop的读取权限

当我们需要更新补丁程序时,若能够访问供应商文件的历史记录,那个就太好了

所以我的问题是:

有没有一种方法可以让经过修补的“供应商分支”以某种方式保持对供应商文件历史记录的访问

(我看到有人提到svn:external folders,但我不确定我是否真的理解与修订挂钩的全部后果,也不确定我们将如何针对这一点维护自己的补丁。)

这里的正确路线是什么?(FWIW,供应商每月发布一次。我们打算每年发布一次/两次更新。)


谢谢

好的,麻烦就在这里,您需要供应商的源代码和历史记录,但您也要将修补程序应用到供应商的源代码。从历史中获取它们的来源是很容易的。从历史中获取他们的来源,然后应用你的补丁并不断地这样做,这是很困难的

现在假设您没有将供应商的源目录放入源代码中(这意味着您分别构建了这两个项目),那么如果您将这两个源代码保存在单独的存储库中,您有两个选项

如果希望供应商的源代码与历史记录一起提供,可以将svnsync设置到供应商存储库,并定期提取他们的更改。Svnsync是一种非常好的方式,可以远程获取具有完整历史记录的本地副本。但是svnsync需要注意的一点是,存储库变为只读。因此,无法将修补程序应用于其源

现在,因为您一年只做一到两次,所以您可以使用svnsync完成提取存储库新副本的过程。中断同步并使供应商回购协议的副本可写,然后应用修补程序

另一种选择是让供应商转储他们的回购协议并将其发送给您。然后将该转储加载到您自己的存储库中,并进行读/写操作

无论使用哪种方法,您都必须在每次执行此过程时将修补程序重新应用于供应商存储库的副本。至少你一年只做一两次


现在,如果必须在源代码中包含它们的源代码,仍然要执行上面的操作,但是要使用svn:external,就像您在问题中提到的那样。您仍然需要将需要对供应商源代码所做的任何修补程序应用到供应商存储库的副本中。

这不是您期望的答案,但是(尽管我非常喜欢svn),如果您希望集中处理分支,那么svn对您来说可能不是一个好的决定。我建议您不要使用SVN,而是使用Mercurial或GIT Mercurial。Mercurial更简单,我将其用于我的私人项目,GIT更强大。@zerkms是的,SVN是一种“业务需求”,很遗憾。在这件事上没有选择。@zerkms,分支在Subversion中工作得很好。你只需要知道如何使用这些工具,并牢牢掌握版本控制技术和方法。你能澄清一下你所说的svn:externals是什么意思吗?我是否可以基于svn:external在我自己的回购协议中维护一个打补丁的分支?svn:externals用法说明:您可以将供应商的源代码与特定的供应商源代码补丁一起放在它自己的存储库中。如果您的项目(在它自己的存储库中)也编译了修补供应商的源代码和它自己的源代码,那么使用svn:externals将是最好的解决方案。这是因为您指示定期提取供应商源的较新版本。这将使您更容易交换供应商源。@nonot1:我不会将供应商源视为一个分支,而是一个单独的项目存储在它自己的存储库中。这将使自动刷新供应商源代码变得更容易。但是,将供应商源代码放在单独的存储库中实际上就像一个分支,您可以将自己的补丁程序应用到该分支。然后,您可以使用svn:externals将其包含在您的项目源中(如果需要)。