SVN部分分支

Pet*_*pac 3 svn branch

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

我们有一个带有第一级目录的"主干":

10 <-- documents
20 <-- source code, db scripts, ...
30 <-- documents
40 <-- referenced 3rd party library-es
Run Code Online (Sandbox Code Playgroud)

我从"后备箱"做了一个"开发"分支.在"开发"中,我们更改了源代码,在测试之后,我们将其合并到"trunk".

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

解决方案仍应:

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

编辑:我忘了提到"源代码"不仅在20中.有引用的dll-s和构建脚本等也在第1级目录,比方说40.

kdg*_*ory 11

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

我假设你正在使用"标准"存储库布局,它在顶层有三个子目录,trunk,branchestags.而且,你的10,20,30,和40目录正在树干.换一种说法:

trunk
    10
    20
    30
    40
branches
tags
Run Code Online (Sandbox Code Playgroud)

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

trunk
    10
    20
    30
    40
branches
    sandbox
        20
        40
tags
Run Code Online (Sandbox Code Playgroud)

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

10
20
30
40
dev
    20
    40
Run Code Online (Sandbox Code Playgroud)

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

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

svnadmin create temp.repo
REPO="file://`pwd`/temp.repo"
svn co $REPO temp
Run Code Online (Sandbox Code Playgroud)

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

file:///home/kgregory/Workspace/temp.repo
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

此时我们有示例目录和两个文件.这是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
Run Code Online (Sandbox Code Playgroud)

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

svn mkdir branches/sandbox
pushd branches/sandbox
svn copy ${REPO}/trunk/20 .
svn copy ${REPO}/trunk/40 .
svn commit -m "make development branch"
popd
Run Code Online (Sandbox Code Playgroud)

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

执行此操作后,我的工作副本如下所示:

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
Run Code Online (Sandbox Code Playgroud)

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

svn co ${REPO}/branches/sandbox sandbox
cd sandbox
Run Code Online (Sandbox Code Playgroud)

现在做一些改变:

vi 20/change.txt
svn commit -m "changed on branch"
Run Code Online (Sandbox Code Playgroud)

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

svn co ${REPO}/trunk trunk
cd trunk
Run Code Online (Sandbox Code Playgroud)

并从沙箱合并.Subversion文档中描述了合并过程:

svn merge -r 4:5 ${REPO}/branches/sandbox
svn status
Run Code Online (Sandbox Code Playgroud)

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