不确定如何问这个。我想以成熟且积极更新的开源项目为基础,以此为基础进行调整和学习。我希望能够将代码添加到本地源中,但是能够在改进核心资源的同时保留我的附加组件,从而对其进行更新。
目的是使基础始终保持最新状态,并将我的代码添加到更新的版本中(而不是被更改所覆盖,就像我想象的那样,如果按原样编辑源代码会发生这种情况)。
有没有一种方法可以将我的代码“修补”到更新的项目代码上,所以当用svn更新核心源代码时,我的更改将保持与基础无关吗?我敢肯定有一种简单的方法可以做到这一点,但是我对编程/svn/版本控制还是陌生的,也不知道该看什么或在哪里看。
最佳答案
您在寻找什么叫做SVN Vendor Branches。
基本上,您在存储库中仅为项目的基线版本保留了一个单独的分支,然后将项目版本之间的更改合并到主干中。
例如:
svn import ./projectdir svn://repourl/project/branches/vendor/current/ -m 'Home for current core version of source code'
svn copy svn://repourl/project/branches/vendor/current/ svn://repourl/project/branches/vendor/1.0.0/ -m '1.0.0 tag of core source code'
svn copy svn://repourl/project/branches/vendor/current/ svn://repourl/project/trunk/ -m 'Initial trunk commit of 1.0.0'
我们现在拥有的是:
现在,假设您已经在该项目上工作了几个月,并且已经在您的主干中对该项目进行了大量更新。核心版本1.1.0出现了,您想利用一些新功能而不丢失现有工作。
您可以为此使用供应商分支。
svn co svn://repourl/project/branches/vendor/current/ ./project
* 在工作副本顶部提取版本1.1.0 *
svn status | grep -E '^?' | xargs svn add # add all new files/directories to the project
svn status | grep -E '^!' | xargs rm -rf # remove all files/directories from the project that have been deleted
svn commit -m 'Version 1.1.0 of the core code'
svn copy svn://repourl/project/branches/vendor/current/ svn://repourl/project/branches/vendor/1.1.0 -m 'Tag for 1.1.0'
rm -rf ./project
现在,我们有什么?我们有:
那么,我们需要做什么?一个简单的合并。
svn co svn://repourl/project/trunk ./project
svn merge svn://repourl/branches/vendor/1.0.0 svn://repourl/branches/vendor/1.1.0 ./project
您要告诉SVN在上面的行中执行的操作基本上是:“找到项目的1.0.0版本和项目的1.1.0之间的差异,然后将这些差异合并到我的项目的修改版本中。”
对于大多数文件,合并将变得顺畅无阻。对于您和社区同时进行修改的其他人,SVN将提示冲突。除非您对真的做了进行了很大的更改,否则应该不难合并这些冲突。我建议为“推迟冲突解决”选择“ p ”,并使用TortoiseSVN解决它们。这样做很容易。
解决所有冲突后,请继续测试该应用程序。如果一切都按预期进行,请继续并对您的工作副本进行
svn commit
。...您就完成了!
关于此主题的更多引用资料:
关于svn - 有没有一种方法可以将我的代码 'patch'到开放源代码中,所以随着开放源代码项目的改进,我的更改将在本地进行处理吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2072073/