首页 > 解决方案 > 将 TortoiseSVN 中的分支与历史合并

问题描述

我在一个简单的存储库中工作,有一辆卡车和一个分支。自分支以来没有对主干进行任何更改,并且在分支上进行了许多提交。如何将分支合并回主干,以便在一个历史记录中的分支中获得包含更改的完整历史记录?

标签: svnmergetortoisesvn

解决方案


通常在 Subversion 中,将整个范围合并到一个提交中,就像 git 中的壁球合并:

svn merge -r[REVISION1]:[REVISION2] svn://[REPO-URL]/[BRANCH] [TRUNK-DIR]

从 Subversion 1.5 开始,关于各个原始提交的信息保留在svn:mergeinfo属性中。在 TortoiseSVN 中,您可以在菜单项“属性”下找到这些。在命令行上,您可以按如下方式查询该信息:

svn propget "svn:mergeinfo" [PATH]

如果你真的想对每个原始提交进行一次合并提交,你需要自己做这些——我想这会很痛苦,尤其是使用 TortoiseSVN。

或者,您可以使用脚本为您执行提交。由于您使用的是 TortoiseSVN,我确定您使用的是 Windows,因此我创建了一个快速批处理文件来完成这项工作。它将遍历一系列修订,检查源分支是否确实具有该修订,如果是,它将首先合并它,然后将其与原始提交消息的副本一起提交。[REVISION1]将是源分支的第一次提交,也是源分支[REVISION2]的最后一次提交。

照原样并且为了保证安全,该脚本仅通过执行svn merges 来修改您的工作副本 (WC),但它不执行svn commits。因此,首先,将目标分支(在您的情况下为主干)检出到一个新的 WC 中,并检查该脚本是否按预期运行 - 即是否只有相关修订版合并到 WC 中。如果是这样,再次将目标分支检出到另一个新的 WC 中,并删除REM脚本中的最后一个以激活提交。

@ECHO OFF
REM inspired by https://stackoverflow.com/a/6192099/1529709
SETLOCAL EnableDelayedExpansion 
SET BRANCH=svn://[REPO-URL]/[BRANCH]

FOR /L %%G IN ([REVISION1],1,[REVISION2]) DO (
    REM check if log is empty and only merge if not
    svn log -c %%G %BRANCH% > tmp-log.txt
    FINDSTR /V "\-----------" tmp-log.txt > NUL
    IF NOT ERRORLEVEL 1 ( 
        ECHO Merging revision %%G
        ECHO merge commit from %BRANCH% > tmp-commit.txt && ECHO. >> tmp-commit.txt
        TYPE tmp-log.txt >> tmp-commit.txt
        svn merge -c %%G %BRANCH% .

        REM *** check results first before you activate committing! ***
        REM svn commit -F tmp-commit.txt

    ) ELSE (
        ECHO Skipping revision %%G
    )
)
IF EXIST tmp-commit.txt DEL tmp-commit.txt
IF EXIST tmp-log.txt DEL tmp-log.txt

免责声明:这个脚本的灵感来自这个linux 的变体(它不检查空修订)


推荐阅读