代码之家  ›  专栏  ›  技术社区  ›  pero

SVN部分分支

  •  3
  • pero  · 技术社区  · 15 年前

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

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

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

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

    1. 允许在“开发”工作副本(20和40)的根文件夹上进行“svn更新”
    2. 该更新不应重新创建
    3. 当然,将“开发”合并到“主干”不应删除“主干”中的10或30。

    编辑:

    8 回复  |  直到 15 年前
        1
  •  11
  •   kdgregory    15 年前

    如果我没有看错你的问题,这是一个简单的问题,使用svn copy只将所需的目录复制到分支中——基本上,是来自 伊万·克雷切托夫

    我假设您使用的是“标准”存储库布局,它在顶层有三个子目录, 大旅行箱 , 分支机构 ,及 标签 . 那你的 10 20 , ,及 40 目录在主干下。换言之:

    trunk
        10
        20
        30
        40
    branches
    tags
    

    正如Mike指出的,你的目标是建立一个如下结构:

    trunk
        10
        20
        30
        40
    branches
        sandbox
            20
            40
    tags
    

    从你的帖子(至少在当前编辑时)看不清楚,但你可能有一个目录结构,其中 , 20 ,等均处于最高水平。在这种情况下,您需要创建一个新的顶级目录,我将调用它 发展

    10
    20
    30
    40
    dev
        20
        40
    

    请注意,您不能创建 发展 20

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

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

    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
    

    此时,我们有示例目录和其中的两个文件。这是来自 ,不包括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副本 .

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

    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
    

    此时,您通常会将开发分支签出到一个新的工作目录中,并在那里工作。所以我会这样做(一段时间后) 光盘 返回我的工作区目录):

    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个目录复制到分支中,因此合并不会触及它们。

        2
  •  2
  •   mikek    15 年前

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

        3
  •  2
  •   eglasius    15 年前

    很抱歉,您无法使用当前的存储库结构进行此操作。

        4
  •  1
  •   Michael Wiles    15 年前

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

        5
  •  0
  •   Ivan Krechetov    15 年前

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

    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
    

    完成。

        6
  •  0
  •   Daniel Schaffer    15 年前

    我们这样做:

    -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
    

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

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

        7
  •  0
  •   orip    15 年前

    一些想法:

    • 将docs目录移到主干外,并将其添加为 svn:external
    • 使用脚本(而不是直接脚本)进行合并 svn merge ),并让脚本强制执行规则
        8
  •  0
  •   si618    15 年前

    你考虑过使用吗 svn:externals develop 10号和30号的分行?使用^/从根目录进行相对引用可能是一种好方法。

    authorization 根据需要。

    回购
    ..->大旅行箱
    ..->10

    ..->30
    ..->40
    ..->分支机构
    ..->发展
    ....->10(住在主干上,svn:externals^/trunk/10)
    ....->20(位于分支上,合并到主干)

    ....->40(位于分支上,合并到主干)