Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将多个SVN存储库合并为一个_Svn - Fatal编程技术网

将多个SVN存储库合并为一个

将多个SVN存储库合并为一个,svn,Svn,在考虑了我上一个问题()的答案后,我决定将我拥有的4个左右的存储库合并为一个。当然,这就引出了一个问题,做这件事的最佳方式是什么? 是否有一种方法可以合并两个或多个存储库,以维护这两个存储库的版本历史记录 编辑:我还应该指出,我使用的是Assembla.com,它不提供对svnadmin命令AFAIK的访问 另一个编辑:这有关系吗?如果svnadmin在URL上工作,那么就没有问题。是的,使用and 让我们假设您必须访问存储库,一个具有HEAD修订版100,另一个具有HEAD修订版150 您将转

在考虑了我上一个问题()的答案后,我决定将我拥有的4个左右的存储库合并为一个。当然,这就引出了一个问题,做这件事的最佳方式是什么?

是否有一种方法可以合并两个或多个存储库,以维护这两个存储库的版本历史记录

编辑:我还应该指出,我使用的是Assembla.com,它不提供对svnadmin命令AFAIK的访问

另一个编辑:这有关系吗?如果svnadmin在URL上工作,那么就没有问题。

是的,使用and

让我们假设您必须访问存储库,一个具有HEAD修订版100,另一个具有HEAD修订版150

您将转储第一个存储库并将其加载到新存储库中:您将得到第一个存储库的完整故事,从版本0到版本150

然后您转储第二个存储库并将其加载到新的存储库中:它将加载其完整的历史记录,唯一更改的是实际的修订号。第二个存储库的历史记录将在版本151到版本250的新存储库中表示

两个存储库的完整历史记录都是保留的,只有第二次导入的存储库的修订号会更改

当然,这同样适用于两个以上的存储库


编辑:我是在你编辑的时候发布的,所以我没有看到你的笔记…

编辑:哦,问题编辑是在我打字的时候进行的。这是一个答案

有没有一种方法可以将两个或多个组合在一起 维护版本的存储库 两者的历史


假设

现有存储库的结构如下:

  • 存储库根
    • 分支机构
    • 标签
    • 树干
你需要一个类似这样的结构:

  • 存储库根
    • 项目A
      • 分支机构
      • 标签
      • 树干
    • 项目B
      • 分支机构
      • 标签
      • 树干
然后,对于每个项目存储库:

svnadmin dump > project<n>.dmp
svnadmin dump>project.dmp
然后,对于每个转储文件:

svn mkdir "<repo url>/project<n>"
svnadmin load --parent-dir "project<n>" <filesystem path to repos>
svn mkdir”/project
svnadmin load--父目录“项目”
更复杂的操作是可能的,但这是最简单、最直接的。在转储/加载过程中更改源存储库结构是危险的,但可以通过组合使用
svnadmin dump
svndumpfilter
、手动编辑或附加文本过滤器以及
svnadmin load


与第三方提供商打交道

  • 为每个存储库请求
    svnadmin dump
    文件。提供商应该愿意/能够提供这一点-这是您的代码
  • 在本地创建SVN存储库
  • 对转储文件执行上面列出的操作
  • 验证您最喜爱的客户端的存储库结构是否正确
  • 为组合存储库创建转储文件
  • 请求提供程序从此转储文件填充新存储库

YMMV:这似乎是一个合理的方法,但我从未与这样的第三方提供商合作过。

如果您无法访问svnadmin,这将很难但可行。假设您拥有存储库A和B,并希望将它们合并到存储库C中。以下是完成此操作所需的步骤

  • 请将存储库A的修订版1签出到您的硬盘

  • 在C存储库的根目录上创建一个名为Repository_a的目录,并将其签出到本地硬盘

  • 将文件从A签出(减去.svn文件)复制到存储库A文件夹中的C签出

  • 在C上执行提交

  • 将存储库A的工作副本更新为修订版2,执行步骤3和步骤4,并对每个后续修订重复执行,直到到达页眉

    现在用B做同样的事情


    这与@Davide Gualano的建议基本相同,不需要svnadmin。您可以编写一个简单的脚本来为您的应用程序执行此操作,当然,如果没有太多的修订,您可以手动执行此操作。

    使用Subversion 1.7,您现在可以远程执行转储。也就是说,无需访问本地文件系统和
    svnadmin dump
    命令

    您可以使用
    svnrdump
    获取远程存储库的完整转储。有关语法详细信息,请参阅文档

    请注意,服务器不必运行1.7,只需运行客户端


    这个问题的其他答案使我能够编写下面的脚本。根据您的案例调整回购图。此外,您可能希望将标记和分支移动到“预聚合”目录中,而不是直接移动到新的分支和主干中

    #!/bin/bash
    
    NEWREPO=$(pwd)/newrepo
    NEWREPOCO="${NEWREPO}_co"
    DUMPS=repodumps
    REV="0:HEAD"
    REPOROOT=/data/svn/2.2.1/repositories/
    TOOLDIR=/opt/svn/2.2.1/bin/
    PATH=${PATH}:${TOOLDIR}
    
    # Old Repository mapping 
    declare -A REPOS=( 
        [BlaEntityBeans]='(
            [newname]="EntityBeans"
        )'
        [OldServletRepoServlet]='(
            [newname]="SpreadsheetImportServlet"
        )'
        [ExperimentalMappingXML]='(
            [newname]="SpreadsheetMappingXML"
        )'
        [NewImportProcess]='(
            [newname]="SpreadsheetImportProcess"
        )'    
    )
    
    dump() {
        rm -fr ${DUMPS}
        mkdir ${DUMPS}
        for repo in "${!REPOS[@]}"
        do
            local dumpfile=${DUMPS}/${repo}.dmp
        echo "Dumpimg Repo ${repo} to ${dumpfile}"
            svnadmin dump -r ${REV} ${REPOROOT}/${repo} > ${dumpfile}
        done
    }
    
    loadRepos() {
        # new big repo
        rm -fr ${NEWREPO}
        svnadmin create ${NEWREPO}
        svn mkdir file:///${NEWREPO}/trunk -m ""
        svn mkdir file:///${NEWREPO}/branches -m ""
        svn mkdir file:///${NEWREPO}/tags -m ""
    
        # add the old projects as modules
        for currentname in "${!REPOS[@]}"
        do  
            declare -A repo=${REPOS[$currentname]}
            local newname=${repo[newname]}
            echo "Loading repo ${currentname} soon to be ${newname}"
            dumpfile=${DUMPS}/${currentname}.dmp
    
            # import the current repo into a trmporary root position
            svn mkdir file:///${NEWREPO}/${currentname} -m "Made module ${currentname}"
            svnadmin load --parent-dir ${currentname} ${NEWREPO} < ${dumpfile}
    
            # now move stuff arround
            # first rename to new repo
            svn move file:///${NEWREPO}/${currentname} file:///${NEWREPO}/${newname} -m "Moved ${currentname} to ${newname}"
            # now move trunk, branches and tags
            for vc in {trunk,branches,tags}
            do
                echo "Moving the current content of $vc into ${NEWREPO}/${vc}/${newname}"
                svn move file:///${NEWREPO}/${newname}/${vc} file:///${NEWREPO}/${vc}/${newname} -m "Done by $0"
            done
        svn rm  file:///${NEWREPO}/${newname} -m "Removed old ${newname}"
        done
    }
    
    dump
    loadRepos
    
    #/bin/bash
    新回购=$(pwd)/新回购
    NEWREPOCO=“${NEWREPO}\u co”
    转储=重新转储
    REV=“0:头”
    repoot=/data/svn/2.2.1/repositories/
    TOOLDIR=/opt/svn/2.2.1/bin/
    路径=${PATH}:${TOOLDIR}
    #旧存储库映射
    声明-A回购协议=(
    [BlaEntityBeans]='(
    [newname]=“EntityBeans”
    )'
    [OldServletRepoServlet]='(
    [newname]=“电子表格导入服务”
    )'
    [ExperimentalMappingXML]='(
    [newname]=“电子表格映射XML”
    )'
    [NewImportProcess]='(
    [newname]=“电子表格导入流程”
    )'    
    )
    转储(){
    rm-fr${DUMPS}
    mkdir${DUMPS}
    对于“${!REPOS[@]}”中的回购
    做
    本地转储文件=${DUMPS}/${repo}.dmp
    回显“Dumpimg Repo${Repo}到${dumpfile}”
    svnadmin dump-r${REV}${repoot}/${repo}>${dumpfile}
    完成
    }
    loadRepos(){
    #新的大型回购协议
    rm-fr${NEWREPO}
    svnadmin创建${NEWREPO}
    svn mkdir文件://${NEWREPO}/trunk-m“”
    svn mkdir文件://${NEWREPO}/branchs-m“”
    svn mkdir文件://${NEWREPO}/tags-m“”
    #添加o
    
     projectA
        branches 
        tags
        trunk
     projectB
        branches
        tags
        trunk
    
    $ svn mkdir -m "Initial project root" \
    file:///var/svn/repository_root/Project_A\
    file:///var/svn/repository_root/Project_B\
    file:///var/svn/repository_root/Project_C\
    
    Revision 1 committed.
    
    $ svnadmin load /var/svn/repository_root --parent-dir Project_A < file-dump-PRJA.dump
    …
    $ svnadmin load /var/svn/repository_root --parent-dir Project_B < file-dump-PRJB.dump