svn子树,从一个repo更新,提交到其他

A在SVN存储库中有一个大项目.我想在其他应用程序中使用该项目的一些模块,所以我考虑从我的主要SVN存储库中检出它们,以便我可以保持我的代码更新.

如何“导出”我的存储库中的一个文件夹/模块,以便我只能将该模块签出到其他项目?我想要包含该模块的其他项目也在他们自己的SVN存储库中.

在简历中,我希望能够对主仓库进行SVN更新,但是对项目仓库进行提交.

我希望它清楚我想做什么.

回应DavidW anwser:

>我有一个包含多个项目的存储库,但我可能会改变它
如有必要.
>我想要成为源代码.它是一个php项目.一世
我正在分发模块. (我有一个全球通用项目,如果我的
客户需要一些特定的功能,
>我想为该客户创建一个单独的项目(也在svn中单独).但我想
有一种方法可以将主项目中的一些更改合并到
客户项目. (例如:全局错误修复或功能).

最佳答案 几个问题:

>您是在谈论多个存储库,还是在同一个存储库中的多个项目?
>如果你借用了这个其他模块的代码,你是否与其他模块保持同步,或者你是否要求该模块?
>你真的想分享什么?您是否必须共享源代码或编译输出(Unix C/C++中的* .so或* .a,Java中的* .jar等).

你给出的答案很大程度上取决于你对这些问题的回答.

我们假设代码实际上是共享的.你在一个人做的是你想要做的另一个.您在项目中进行了更改,其他项目中的代码也会更改.

在这种情况下,请使用svn:externals.这是您放置在目录上的属性.它的作用是将Subversion URL与子目录名称相关联.例如:

$svn propset svn:externals "http://svn.vegibanc.com/svn/trunk/project/stuff utils" .

将属性放在当前目录中.当您进行更新或结帐时,将在您的项目中创建名为utils的目录,Subversion将自动将http://svn.vegibanc.com/svn/trunk/project/stuff结帐到该目录中.它很神奇,但就像所有魔法一样,它既有光明又有黑暗.

首先是光明方面:

这是在两个项目之间共享代码.您在utils目录中进行更改并提交更改,项目中的stuff子目录将更新.我用它来为我的项目构建工具.如果我升级该工具,所有项目都会获得升级后的工具.

现在,黑暗的一面:

如果你像我给你看的那样定义svn:externals,你会深感遗憾.想象一下,如果你决定将你的工作分支到一个版本.那么,你的utils目录仍然指向项目/东西的主干.如果您为2.1版本分支,而trunk现在正在使用2.2,那么您将获得不需要的utils内容.

更糟糕的是,如果您创建标记,该标记将继续更改,因为trunk中的utils目录仍在更改中.

因此,强烈建议您指定URL的确切版本:

$svn propset svn:externals "-r23283 ^/trunk/project/stuff@23283 utils" .
$svn propset svn:externals "^/tags/2.3.3/project/stuff utils" .

首先,我指的是URL的特定修订版.它完全不变.如果我需要将其指向另一个修订版,我需要更改svn:externals属性本身.

第二个是指向特定标签.它不是那么安全,因为标签可以更改,但我可以通过这种方式将我的外部依赖关系视为一种释放.我正在使用东西实用程序的2.3.3版本.

两者都使用^快捷方式,它只是意味着Subversion存储库根目录.这样,如果您将Subversion存储库移动到另一个系统,或者从http更改为svn,您的外部仍然可以工作.
当然,如果你这样做,你永远无法改变svn:externals下的代码.而且,这不是你想要的.

您也可以使用相对URL,但它们更危险.

想象一下这样的两个项目,你想让stuff目录成为utils目录的svn:external链接:

http://svn.vegibanc.com/svn/trunk/project/foo/stuff
http://svn.vegibanc.com/svn/trunk/project/bar/utils

该项目分支在一起并标记在一起.你可以这样做:

$co http://svn.vegibanc.com/svn/trunk/project/bar bar-trunk
$cd project-bar
$svn propset svn:externals "../foo/stuff utils" .

这会将stuff目录从外部链接到utils目录.但是,它是以相对的方式完成的.如果你这样做:

$cp http://svn.vegibanc.com/svn/trunk http://svn.vegibank.com/svn/branches/2.3

您的utils目录仍将外部链接到foo项目下的stuff目录,但它们都将位于2.3分支上.

更改bar / utils中的代码将改变foo / stuff中的代码,反之亦然.您仍在共享代码,但两种项目仍处于同一分支中.

稍后,如果你这样标记:

$cp http://svn.vegibank.com/svn/branches/2.3 http://svn.vegibank.com/svn/tags/2.3.0

您的标记2.3.0不太可能更改,因为外部链接及其链接的内容都被该标记所包围.

以上假设您正在共享代码,而任一项目中的更改都会影响另一项.

更好的方法是让foo创建一个可以存储在发布服务器上的某种编译对象(如JAR文件或* .so).您将此编译对象视为具有自己的版本控制的自己的项目,您的项目将取决于此对象的特定版本.不幸的是,这并不总是有效.

如果您只是分叉代码,请从存储库中的一个位置执行svn cp到另一个位置.您可以在不影响其他项目的情况下进行更改,反之亦然.更好的是,您可以在两个位置之间来回合并更改,以使它们保持同步.

希望这能回答你的问题.如果您可以扩展您的问题并向我们提供您想要的更多详细信息,我将能够更新我的答案.

点赞