我是SVN的新手,所以这可能是一个简单的问题。
我们有一个带有第一级目录的“主干”:
10 <-- documents
20 <-- source code, db scripts, ...
30 <-- documents
40 <-- referenced 3rd party library-es
我从“主干”做了一个“开发”分支。 在“开发”中,我们更改了源代码,在测试之后,我们将其合并到“trunk”。
目录“10”和“30”中的问题是存储了开发不需要的* .doc文件,因此需要“develop”分支没有这些目录。
解决方案仍然应该:
编辑: 我忘了提到“源代码”不仅仅是20个。有引用的dll-s和构建脚本等也在第1级目录上,比方说40。
答案 0 :(得分:11)
如果我正确地阅读了你的问题,这是一个简单的问题,即使用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的路径):< / p>
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 docs:
中描述svn merge -r 4:5 ${REPO}/branches/sandbox
svn status
最后一个命令应该显示只有文件20/change.txt
受到合并的影响。由于您没有将10或30个目录复制到分支中,因此合并不会触及它们。
答案 1 :(得分:2)
你想要做的是在你的svn树中的某个地方创建一个“20”的副本,你可以来回合并。一个共同的结构是
repo
---> trunk
---> 10
---> 20
---> 30
---> branches
---> sandboxes
---> develop <branch of 20>
---> tags
当您想要更新“develop”时,您可以在沙箱下创建一个“20”的新分支,或者从20开始进行合并以进行开发。当您希望在“主干”中更改“开发”时,您可以合并另一种方式。您的开发人员应查看“开发”副本(或根据“开发”创建自己的分支)
答案 2 :(得分:2)
afaik你不能用你现有的存储库结构来做。
我建议您重新构建您的存储库,所以10&amp; 20,40&amp;其他代码相关资产在新的第1级文件夹下移动。这样就可以避免这种情况,并简化只能抓取与代码相关的资产。
答案 3 :(得分:1)
理想情况下,您应该在较低级别进行分支。即分支20不是主干。这样你就只能分支应该分支的内容。即你想要分支。
答案 4 :(得分:0)
您可以通过仅将工作副本的源代码子目录指向其分支来实现此目的。
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
然后提交。 完成。
答案 5 :(得分:0)
我们这样做:
-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
在此示例中,第三方程序集具有自己的存储库。这样您就不会在每个分支和主干中维护不同的版本。作为旁注,任何程序集的最新版本都复制在每个程序集的“当前”文件夹中。这允许更新程序集,而无需更新所有项目中的引用。这可能不是您所在领域的问题,但这对我们来说是一个巨大的痛苦。
另请注意,文档与层次结构和分支在层次结构中处于同一级别。这样,这些文件不会重复。如果这不是一个选项,那么这些也可以是外部的,这将允许它们出现在主干和分支中而不需要单独的源控制。
答案 6 :(得分:0)
您构建项目的方式以及docs dir限制不适合开箱即用的SVN模型。
一些想法:
svn:external
svn merge
)进行合并,并让脚本强制执行规则答案 7 :(得分:0)
来自你的评论:
我们希望防止修改10和30中的文档。它们只能在主干中修改。
您是否考虑在develop
分支中使用svn:externals 10和30?使用^ /从root进行相对引用可能是一种很好的方法。
因此,虽然分支上可以访问10,20,30和40,但仍然可以从主干引用10和30。然后,您可以根据需要定义authorization需求。
回购
..-&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(住在树枝上,合并到树干)