我是 SVN 新手,所以这可能是一个简单的问题。

我们有一个带有一级目录的“主干”:

10 <-- documents
20 <-- source code, db scripts, ...
30 <-- documents
40 <-- referenced 3rd party library-es

我从“主干”创建了一个“开发”分支。在“开发”中,我们更改源代码,并在测试后将其合并到“主干”。

问题在于目录“10”和“30”中存储了开发不需要的 *.doc 文件,因此要求“develop”分支没有这些目录。

解决方案仍然应该:

  1. 允许“develop”工作副本的根文件夹上的“svn update”(20 和 40)
  2. 该更新不应重新创建目录10和30,并且
  3. 当然,将“develop”合并到“trunk”不应删除“trunk”中的 10 或 30。

编辑:我忘了说“源代码”不仅仅存在于20中。有引用的 dll-s 和构建脚本等。也在第一级目录中,比如说 40。

有帮助吗?

解决方案

如果我正确地阅读了你的问题,这是一个简单的问题,即使用svn copy只将所需目录复制到分支中 - 基本上,来自 Mike Kushner 的答案组合Ivan Krechetov 。但是,我认为在完成这些步骤之后可能会更容易理解,因此本文的其余部分将创建一个示例存储库并显示副本和合并。

我将假设你使用的是“标准”。存储库布局,在顶层有三个子目录, trunk branches 标记。并且您的 10 20 30 40 目录位于主干下。换句话说:

trunk
    10
    20
    30
    40
branches
tags

而且,正如迈克指出的那样,你的目标是建立一个如下所示的结构:

trunk
    10
    20
    30
    40
branches
    sandbox
        20
        40
tags

目前还不清楚您的帖子(至少是当前编辑的内容),但您可能有一个目录结构,其中 10 20 ,等等顶级。在这种情况下,您需要创建一个新的顶级目录,我将其称为 dev ,以便您的整个存储库如下所示:

10
20
30
40
dev
    20
    40

请注意,您无法在 20 下创建 dev 。嗯,实际上你可以,但是你几乎可以保证在这样做时打破你的构建。

好的,让我们来看一个例子,我们在其中创建一个新的存储库并在其中放入一些文件。你必须能够运行 svnadmin 命令(你应该能够做到这一点,除非你有一个偏执的系统管理员)。因此,选择一个临时目录,并执行以下命令(我正在运行Linux;如果您运行Windows,命令将是相同的,但您需要在REPO变量中放置特定于Windows的路径):

svnadmin create temp.repo
REPO="file://`pwd`/temp.repo"
svn co $REPO temp

这将创建一个新的(空)存储库,并检出它的工作副本。第二行需要一些解释:它只是从当前目录创建存储库URL。在我的工作区目录中,URL如下所示:

file:///home/kgregory/Workspace/temp.repo

好的,既然你已经有了工作副本,那就让我们创建一个示例目录结构和一些文件:

cd temp
svn mkdir trunk
svn mkdir branches
svn mkdir tags
svn commit -m "standard repo structure"

pushd trunk
svn mkdir 10
svn mkdir 20
svn mkdir 30
svn mkdir 40
svn commit -m "example sub-project structure"

echo "this doesn't change" > 10/dontchange.txt
svn add 10/dontchange.txt
echo "this does change" > 20/change.txt
svn add 20/change.txt
svn status
svn commit -m "example files"
popd

此时我们有示例目录和两个文件。这是 find 的输出,不包括subversion的隐藏目录:

temp, 531> find . | grep -v svn
.
./tags
./trunk
./trunk/10
./trunk/10/dontchange.txt
./trunk/30
./trunk/20
./trunk/20/change.txt
./trunk/40
./branches

下一步是创建沙箱目录,并复制其中的两个目录:

svn mkdir branches/sandbox
pushd branches/sandbox
svn copy ${REPO}/trunk/20 .
svn copy ${REPO}/trunk/40 .
svn commit -m "make development branch"
popd

这是重要的部分:我在工作目录中创建分支和副本,作为存储库中的副本。通常,您只需将 trunk 复制到 branches 的子代中,使用带有两个存储库参数的 svn copy 。这在这里不起作用,因为我们只想要 trunk 的两个孩子。

完成此操作后,我的工作副本如下所示:

temp, 539> find . | grep -v svn
.
./tags
./trunk
./trunk/10
./trunk/10/dontchange.txt
./trunk/30
./trunk/20
./trunk/20/change.txt
./trunk/40
./branches
./branches/sandbox
./branches/sandbox/20
./branches/sandbox/20/change.txt
./branches/sandbox/40

此时,您通常会将开发分支检出到新的工作目录并在那里工作。所以我会这样做(在 cd 之后回到我的Workspace目录):

svn co ${REPO}/branches/sandbox sandbox
cd sandbox

现在做一些改变:

vi 20/change.txt
svn commit -m "changed on branch"

好的,现在是时候合并回主干了。所以回到工作区,看看后备箱:

svn co ${REPO}/trunk trunk
cd trunk

从沙箱中合并。合并过程在中有所描述。 Subversion文档

svn merge -r 4:5 ${REPO}/branches/sandbox
svn status

最后一个命令应该显示只有文件 20 / change.txt 受到合并的影响。由于您没有将10或30个目录复制到分支中,因此合并不会触及它们。

其他提示

您要做的是创建“20”的副本。你的svn树中的某个地方,你可以来回合并。一个共同的结构是

repo
---> trunk
    ---> 10 
    ---> 20
    ---> 30
---> branches
    ---> sandboxes
        ---> develop <branch of 20>
---> tags

当您想要更新“开发”时,您要么创建一个“20”的新分支。在沙箱下或从20开始进行合并。当你想要“发展”的变化时回到你的行李箱,你以另一种方式合并。您的开发人员应查看“开发”副本。 (或根据“开发”创建自己的分支)

afaik你不能用你现有的存储库结构来做。

我建议您重新构建您的存储库,所以10&amp; 20,40&amp;其他代码相关资产在新的第1级文件夹下移动。这样就可以避免这种情况,并简化只能抓取与代码相关的资产。

理想情况下,您应该在较低级别进行分支。即分支20不是主干。这样你就只能分支应该分支的内容。即你想要分支。

您可以通过仅将工作副本的源代码子目录指向其分支来实现此目的。

svn cp http://example.com/svnrepo/trunk/source_code http://example.com/svnrepo/branches/development/source_code

cd ./source_code
svn sw http://example.com/svnrepo/branches/development/source_code

进行更改,提交。然后,让我们合并到主干:

svn sw http://example.com/svnrepo/trunk/source_code
cd ..
svn merge -r [start_rev]:HEAD http://example.com/svnrepo/branches/development/source_code ./source_code

检查以确保一切正常:

svn diff | less

然后提交。 完成。

我们这样做:

-repo: Assemblies
--SomeAssembly
---Current
---v1.0
---v1.1
-repo: Source
--trunk
---Code
---Assemblies (external from Assemblies repo)
--branches
---v1.0
----Code
----Assemblies (external from Assemblies repo)
--Documents

在此示例中,第三方程序集具有自己的存储库。这样您就不会在每个分支和主干中维护不同的版本。作为旁注,任何组件的最新版本都复制在“当前”组件中。每个程序集的文件夹。这允许更新程序集,而无需更新所有项目中的引用。这可能不是您所在领域的问题,但这对我们来说是一个巨大的痛苦。

另请注意,文档与层次结构和分支在层次结构中处于同一级别。这样,这些文件不会重复。如果这不是一个选项,那些也可以是外部的,这将允许它们出现在主干和分支中而不需要单独的源控制。

您构建项目的方式以及文档目录限制并不适合开箱即用的 SVN 模型。

一些想法:

  • 将文档目录移到主干之外,并将其添加为 svn:external
  • 将文档目录移到主干之外,并使用构建脚本将主干和文档目录结合起来
  • 使用脚本合并(而不是直接 svn merge),并让脚本强制执行规则

来自你的评论:

  

我们希望防止修改10和30中的文档。它们只能在主干中修改。

您是否考虑过使用 svn:externals develop 分支10和30?使用^ /从root进行相对引用可能是一种很好的方法。

因此,虽然分支上可以访问10,20,30和40,但仍然可以从主干引用10和30。然后,您可以根据需要定义授权需求。

  

回购结果   ..-&GT;树干结果   ....-&GT; 10个结果   ....-&GT; 20个结果   ....-&GT; 30个结果   ....-&GT; 40个结果   ..-&GT;枝结果   ....-&GT;发展结果   ......-&GT; 10(生活在主干上,svn:externals ^ / trunk / 10)
  ......-&GT; 20(住在树枝上,合并到树干)
  ......-&GT; 30(住在主干,svn:externals ^ / trunk / 30)
  ......-&GT; 40(住在树枝上,合并到树干)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top